如何recursion地执行深层目录结构中的每个文件的命令?

我有一个深层的目录结构,有大量的文件(大约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移动到你想要的位置,但这只是另一个命令,每个批处理都必须运行。