![如何递归地对深层目录结构中的每个文件执行命令?](https://linux22.com/image/661165/%E5%A6%82%E4%BD%95%E9%80%92%E5%BD%92%E5%9C%B0%E5%AF%B9%E6%B7%B1%E5%B1%82%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84%E4%B8%AD%E7%9A%84%E6%AF%8F%E4%B8%AA%E6%96%87%E4%BB%B6%E6%89%A7%E8%A1%8C%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
我有一个深层目录结构,包含大量文件(约 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
到原来的位置,但这只是每个批次都必须运行的另一个命令。