使用bash/别名对目录中的文件进行grep删除的最有效方法
我有一个Debian虚拟专用服务器,它承载多个虚拟域和用户。它的配置是为了承载多个域,并且在每个域名下都有多个电子邮件地址(用户或帐户) 我经常收到垃圾邮件,没有时间查看使用bash/别名对目录中的文件进行grep删除的最有效方法,bash,grep,debian,spam,Bash,Grep,Debian,Spam,我有一个Debian虚拟专用服务器,它承载多个虚拟域和用户。它的配置是为了承载多个域,并且在每个域名下都有多个电子邮件地址(用户或帐户) 我经常收到垃圾邮件,没有时间查看SpamAssasin如何根据邮件正文中匹配的字符串过滤某些电子邮件 相反,以下函数被添加到.bash\u alias中,并对其进行了别名设置以供快速访问使用 my_new_del() { echo "0: $1" for d in /home/vmail/*/ ; do # echo "1: $d"
SpamAssasin
如何根据邮件正文中匹配的字符串过滤某些电子邮件
相反,以下函数被添加到.bash\u alias
中,并对其进行了别名设置以供快速访问使用
my_new_del() {
echo "0: $1"
for d in /home/vmail/*/ ; do
# echo "1: $d"
for f in "$d"info/*/*.some.file.pattern*;do
grep -i -H -l -s "$1" "$f" | while read -r line ; do
echo "rm -rf $line"
rm -rf $line
done
# echo "2: $f"
done
done
}
alias my_del=my_new_del
然后我使用上面的别名:
my_del 'some string' &
脚本完成了这项工作,但速度非常慢,而且似乎效率低下。它循环遍历vmail目录中的每个子目录(每个子目录代表一个域名)。然后,它循环遍历每个子目录中的文件,然后greps查找字符串,如果找到匹配项,则将其删除
这能以更有效的方式完成吗?您没有提供任何示例输入/输出,因此这是未经测试的,但听起来您正试图这样做:
my_new_del() {
find /home/vmail -type f -name '*.some.file.pattern*' -exec grep -i -H -l -s "$1" {} + |
xargs rm -f {}
}
我假设您的文件名不包含任何空格,因为您现有的脚本依赖于该假设。编辑您的Q,以说明有多少文件位于
/home/vmail
目录下。看起来您每次都在重新处理所有文件以运行此程序,因此,如果您能够找到一种方法来隐藏/移动干净的文件,然后只扫描新文件,那么您的处理过程应该会大大加快。祝你好运。你似乎在为每个小文件调用grep
一次。这比让grep同时搜索多个文件要慢得多。@TheotherGuy grep怎么能搜索多个文件?我假设如果你运行grep'string'*
它仍然会在目录中的文件中循环,不是吗?问题的关键是,如果你有一千个、一百万个或十亿个文件,方法可能会有所不同。你不知道具体有多少个,但你只知道几个数量级。wrt我假设如果你运行grep'string',它仍然会循环遍历目录中的文件
-grep string*和for f in*在性能上有很大的不同;执行grep字符串“$f”;完成
。在前者中,您只要求shell生成一次grep进程(一个耗时的任务),而在后者中,shell为每个文件生成一次grep进程。请再次参阅以了解详细信息。示例输入输出是什么?存在文件,并且文件的内容与“某些字符串”
匹配或不匹配。这是问题本身。你的答案比我现在的答案更有效率吗?我的解决方案也有效。输入:在包含3个文件的目录上运行ls
的结果+在每个文件上运行cat
的结果,以显示其中一个或两个确实包含目标字符串,而另一个不包含。输出:ls
的结果再次显示预期文件已删除。如何提高效率?它的效率将提高几个数量级,因为它避免了嵌套循环(包括读取时最内层的)和无关命令。有关shell循环的一些问题,请参阅。原始脚本速度较慢,主要是因为它每个文件有2个分叉。此版本仅为每个文件提供~0.001个分叉。它应该快得多。不,这不是这个解决方案的问题。它使用xargs和find-exec+
来避免它。就像一个符咒。我确实用time
命令调用了别名函数来计时执行。原始脚本运行于:real 3m19.912s user 0m16.260s sys 0m25.832s
,其中新修改的脚本运行于real 0m6.008s user 0m4.588s sys 0m0.684s
。这是一个很大的进步。谢谢