使用bash/别名对目录中的文件进行grep删除的最有效方法

使用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"

我有一个Debian虚拟专用服务器,它承载多个虚拟域和用户。它的配置是为了承载多个域,并且在每个域名下都有多个电子邮件地址(用户或帐户)

我经常收到垃圾邮件,没有时间查看
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
。这是一个很大的进步。谢谢