我怎么能避免'太多的争论'

时间:2013-04-18 15:18:32

标签: linux bash grep

我试图清除一些垃圾邮件并遇到问题。队列中的文件数量太大,以至于我的常用命令无法处理。它会给我一个关于太多论点的错误。

我通常这样做

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

5 个答案:

答案 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

这使用管道和循环而不是参数(greprm),并防止与参数限制相关的问题。