【发布时间】:2018-10-04 17:58:58
【问题描述】:
我有一个托管多个虚拟域和用户的 Debian 虚拟专用服务器。它的配置是为了托管多个域并在每个域名下拥有多个电子邮件地址(用户或帐户)。
我确实经常收到垃圾邮件,没有时间查看SpamAssasin,了解如何根据电子邮件正文中的匹配字符串过滤某些电子邮件。
相反,.bash_aliases 中添加了以下函数,并为快速访问使用了别名
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 - 如果匹配,则将其删除。
这能以更有效的方式完成吗?
【问题讨论】:
-
编辑您的 Q 以说明
/home/vmail目录下有多少文件。看起来您每次都在重新处理所有文件来运行它,所以如果您能找到一种方法来隐藏/移动干净的文件,然后只扫描新文件,那应该会显着加快您的进程。祝你好运。 -
您似乎为每个可能很小的文件调用一次
grep。这比让grep同时搜索多个文件要慢得多。 -
@thatotherguy grep 如何搜索多个文件?我假设如果你运行
grep 'string' *,它仍然会遍历目录中的文件,不是吗? -
问的重点是,如果您有一千个、一百万个或十亿个文件,方法可能会有所不同。您不会确切知道有多少,但您会知道几个数量级。
-
wrt
I assumed that if you run grep 'string' * it will still loop through the files in the directory-grep string *和for f in *; do grep string "$f"; done之间的性能差异很大。在前者中,您只要求 shell 生成一次 grep 进程(一项耗时的任务),而在后者中,shell 每个文件生成一次。再次,请参阅why-is-using-a-shell-loop-to-process-text-considered-bad-practice 了解详情。