我试图清除一些垃圾邮件并遇到问题。队列中的文件数量太大,以至于我的常用命令无法处理。它会给我一个关于太多论点的错误。
我通常这样做
grep -i user@domain.com 1US* | awk -F: '{print $1}' | xargs rm
1US *可以是1US [a-zA-Z]之间的任何值。我唯一能做的就是运行这个可怕的装置。它的一个文件,包括1USa,1USA,1USb等,通过整个字母表。我知道他们必须更有效地运行它。
grep -s $SPAMMER /var/mailcleaner/spool/exim_stage1/input/1USa* | awk -F: '{print $1}' | xargs rm
grep -s $SPAMMER /var/mailcleaner/spool/exim_stage1/input/1USA* | awk -F: '{print $1}' | xargs rm
答案 0 :(得分:2)
您可以使用find
查找名称以“1US”模式开头的所有文件。然后你可以将输出传递给xargs,这会照顾,参数列表不会增长太多并处理grep调用。请注意,我使用了nullbyte来分隔xargs的文件名。这可以避免有问题的文件名出现问题。 ;)
find -maxdepth 1 -name '1US*' -printf '%f\0' | xargs -0 grep -u user@domain | awk ...
答案 1 :(得分:2)
运行grep的几个实例。而不是
grep -i user@domain.com 1US* | awk '{...}' | xargs rm
DO
(for i in 1US*; do grep -li user@domain "$i"; done) | xargs rm
请注意-l标志,因为我们只需要匹配的文件名。这将加速grep(在第一场比赛时终止)并使你的awk脚本不需要。这可以通过检查grep的返回状态和调用rm来改进,而不是使用xargs(xargs非常脆弱,IMO)。如果你问我,我会给你更好的版本。
希望它有所帮助。
答案 2 :(得分:1)
-exec
的{{1}}参数在这里很有用,我在类似的情况下自己也使用了它。
E.g。
find
答案 3 :(得分:1)
使用xargs比使用“find ... -exec grep”更有效,因为你有更少的进程创建等。
解决这个问题的一种方法是:
ls 1US* | xargs grep -i user@domain.com | awk -F: '{print $1}' | xargs rm
但更容易:
find . -iname "1US*" -exec rm {} \;
答案 4 :(得分:0)
使用find
和循环代替xargs
。
find . -name '1US*' | \
while read x; do grep -iq user@domain "$x" && rm "$x"; done
这使用管道和循环而不是参数(grep
和rm
),并防止与参数限制相关的问题。