我怎么能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 

Solutions Collecting From Web of "我怎么能grep,而避免“太多的参数”"

运行多个grep实例。 代替

 grep -i user@domain.com 1US* | awk '{...}' | xargs rm 

 (for i in 1US*; do grep -li user@domain "$i"; done) | xargs rm 

注意-l标志,因为我们只需要匹配的文件名。 这将加速grep(终止第一场比赛),并使您的awk脚本不受欢迎。 这可以通过检查grep的返回状态和调用rm来改进,而不是使用xargs(xargs是非常脆弱的,IMO)。 如果你问,我会给你更好的版本。

希望能帮助到你。

您可以使用find来查找所有名称以模式“1US”开头的文件。 然后你可以将输出传递给xargs,这样会保证参数列表不会增长太多并且处理grep调用。 请注意,我用空字节来分隔xargs的文件名。 这避免了有问题的文件名称的问题 。 ;)

 find -maxdepth 1 -name '1US*' -printf '%f\0' | xargs -0 grep -u user@domain | awk ... 

在这里find -exec参数是有用的,我在类似的情况下使用了这个。

例如

 # List the files that match find /path/to/input/ -type f -exec grep -qiF spammer@spammy.com \{\} \; -print # Once you're sure you've got it right find /path/to/input/ -type f -exec grep -qiF spammer@spammy.com \{\} \; -delete 

使用xargs比使用“find … -exec grep”更有效率,因为你拥有较少的进程创建等。

有一种方法可以做到这一点:

 ls 1US* | xargs grep -i user@domain.com | awk -F: '{print $1}' | xargs rm 

但更容易的是:

 find . -iname "1US*" -exec rm {} \; 

使用find和一个循环来代替xargs

 find . -name '1US*' | \ while read x; do grep -iq user@domain "$x" && rm "$x"; done 

这使用管道和循环代替参数( greprm ),并防止与参数限制有关的问题。