我有一个深层的目录结构,有大量的文件(大约1M)。 我想对每个执行一个命令。 (在我的情况下,这些文件是我想运行optipng的png。)
我试过这个:
find . -name *.png | xargs sudo optipng -o2
但得到错误argument list too long 。
我假设xargs应该能够处理这个问题,而且我的语法一定有问题。
直接执行exec来查找,而不是通过xargs。
sudo find . -name '*.png' -exec optipng -o {} +
正如你所看到的,使用sudo作为命令来执行xargs是行不通的。 试试看:
find . -name '*.png' | sudo xargs optipng -o2
不同的是,你的版本创build一个类似的命令
sudo optipng -o2 file1 file2 file3 file4 ......
和sudo不能处理这么多的参数。
反过来执行一次sudo,然后启动xargs然后生成一个类似的命令
optipng -o2 file1 file2 file3 file4 ......
如果optipng可以处理多个文件作为参数,它应该工作。
如果这仍然不起作用,您将不得不像在Geraint的答案中一样使用-exec ,但这应该是您的最后一招。
还有另一个镜头:
find . -name '*.png' | sudo xargs -nx -P y optipng -o2
这将启动一个optipng为x文件和y这样的进程并行(可能会帮助你更快的完成任务,如果你有一些核心备件)。 x大于10可能不会对性能产生很大的影响。
这将有助于保持参数列表的简短。 所以你可以将sudo移动到你想要的位置,但这只是另一个命令,每个批处理都必须运行。