使用bash / aliases删除目录中grep文件的最有效方法

时间:2018-10-04 17:58:58

标签: bash grep debian spam

我有一个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目录中的每个子目录(每个子目录代表一个域名)。然后,它循环遍历每个子目录中的文件,然后搜寻该字符串-如果匹配则将其删除。

这可以更有效地完成吗?

1 个答案:

答案 0 :(得分:3)

您没有提供任何示例输入/输出,因此未经测试,但这听起来像是您要尝试的操作:

my_new_del() {
    find /home/vmail -type f -name '*.some.file.pattern*' -exec grep -i -H -l -s "$1" {} + |
    xargs rm -f {}
}

我假设您的文件名不包含任何空格,因为您现有的脚本依赖于此假设。