xargs/exec 的参数列表太长

ohb*_*sme 3 linux bash find xargs exec

我正在 CentOS 服务器上工作,我必须四处移动并将数百万个文件整理在一起。我已经尝试了许多类似下面的内容,但所有这些都因参数列表太长错误而失败。

命令:

find ./ -iname out.* -type f -exec mv {} /home/user/trash
find ./paramsFile.* -exec cat > parameters.txt 
Run Code Online (Sandbox Code Playgroud)

错误:

-bash: /usr/bin/find: Argument list too long
-bash: /bin/cat: Argument list too long
Run Code Online (Sandbox Code Playgroud)

或者

echo ./out.* | xargs -I '{}' mv /home/user/trash
(echo ./paramsFile.* | xargs cat) > parameters.txt  
Run Code Online (Sandbox Code Playgroud)

错误:

xargs: argument line too long
xargs: argument line too long              
Run Code Online (Sandbox Code Playgroud)

第二个命令也从未完成。我听说过一些关于通配符的事情,但我不确定我是否完全理解它。欢迎任何提示或建议!

Ber*_*ard 5

你有多个错误。你应该避免*通配符。您必须放在{}引号之间(为了文件名安全),并且必须-exec\;.

find ./ -iname out.\* -type f -exec mv "{}" /home/user/trash \;
find -name ./paramsFile.\* -exec cat "{}" >> parameters.txt \;
Run Code Online (Sandbox Code Playgroud)

这里的问题是*匹配目录中的所有文件,从而给您带来错误。如果find定位文件而不是 shell 通配符,xargs则获取可用于构造正确长度的行的各个文件名。

  • 为了文件名安全,您不必将“{}”放在引号之间!没有引号是完美的,除非你的 shell 用它做了奇怪的事情。 (2认同)