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

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

我有一个深层目录结构,包含大量文件(约 1M)。我想对每个文件执行一个命令。(在我的例子中,这些文件是 png,我想对其运行 optipng。)

我尝试过这个:

find . -name *.png | xargs sudo optipng -o2

但出现了错误argument list too long

我假设 xargs 应该能够处理这个问题,并且我的语法一定有问题。

答案1

直接使用 find 而不是通过 xargs 执行执行。

sudo find . -name '*.png' -exec optipng -o {} +

答案2

如您所见,使用 sudo 作为执行命令xargs不起作用。请尝试相反的方法:

find . -name '*.png' | sudo xargs optipng -o2

不同之处在于您的版本会创建一个类似的命令

 sudo optipng -o2 file1 file2 file3 file4 ......

并且 sudo 无法处理这么多参数。

反过来做的话,就会执行一次 sudo,然后启动xargs,然后生成如下命令

optipng -o2 file1 file2 file3 file4 ......

如果optipng可以将许多文件作为参数处理,它就应该可以工作。

如果仍然不起作用,您将不得不-exec像 Geraint 的答案中那样使用,但这应该是您的最后手段。

答案3

再试一次:

find . -name '*.png' | sudo xargs -n x -P y optipng -o2

这将启动一个针对x文件和y此类进程的并行优化(如果您有多余的核心,可能会帮助您更快地完成任务)。如果x超过 10 个,可能不会对性能产生很大影响。

这将有助于保持参数列表简短。因此,您可能可以移动sudo到原来的位置,但这只是每个批次都必须运行的另一个命令。

相关内容