删除 find: rm 认为参数列表太长的输出指定的文件。

6 find rm

当我运行以下命令时,它给了我一个错误:

$ rm -f `find /home/domain/imap/domain.com/*/Maildir -mtime +190 | grep -E '/cur/|/new/'`
-bash: /bin/rm: Argument list too long
Run Code Online (Sandbox Code Playgroud)

我怎样才能在没有错误的情况下运行它?(或者我怎样才能把它放进去.sh?)

Zor*_*che 9

好吧,我很想做这样的事情,使整个操作成为一个命令。

find /home/domain/imap/domain.com/ -mtime +190 \
     \( -ipath '*/Maildir/new/*' -o -ipath '*/Maildir/cur/*' \) \
     -delete
Run Code Online (Sandbox Code Playgroud)


Dav*_*fer 2

最简单的方法:创建一个循环,通过管道获取结果

find [expression] | while read; do [do something with $REPLY, for example] echo "$REPLY"; done
Run Code Online (Sandbox Code Playgroud)

或临时文件:

FILE="OUT_`date`"
find [expression] > $FILE
while read; do
   [do something with $REPLY, for example] echo "$REPLY"
done < $FILE
Run Code Online (Sandbox Code Playgroud)

请注意,如果您执行“rm”,则参数可能看起来像选项。考虑一个恰好名为“-rf”的文件。因此,如果删除不是从当前目录开始,建议写入rm -- "$FILE"or rm "./$FILE"(或两者) or else 。rm "$PATH/$FILE"而单线find则不存在这个问题。为了避免rm带有选项的命令可能出现别名,请显式调用/bin/rm.