Bash:对 FIND 的结果执行命令

7 bash find

我正在尝试调整使用 FIND 命令找到的所有文件的大小(它们都是目录及其子目录中的所有文件)。我尝试了很多选择,但每次都遇到不同的错误。这是我最后一次尝试:

find /my/folder/ -name '*jpg' -exec 'mogrify -resize 900">"{}' \;
Run Code Online (Sandbox Code Playgroud)

我尝试了许多其他方法,但无济于事。出了什么问题?

lyn*_*man 11

我非常不喜欢 exec on find,特别是当你给它所有的引号时,它有点古老和不可预测:)

尝试使用 xargs,它应该表现得更文明一点

find /my/folder/ -name '*jpg' -print0 | xargs -0 -J% "mogrify -resize 900 > %"

这里不同的东西

-print0 on find 在每个文件名后附加一个 NULL 字符作为分隔符

在 xargs

-0 表示输入由 NULL 字符分隔 -J% 表示 % 应替换为输入中的内容(在这种情况下为文件名)


Phi*_*ack 7

@lynxman 提出了 find/xargs 的传统建议。然而,另一种选择是将 find 与gnu parallel一起使用。Parallel 为 xargs 提供了一些巧妙的增强,例如更复杂的参数处理和并行运行许多作业的能力(我意识到一些较新版本的 xargs 也支持并行作业)。

所以,让我们看看我们是否可以并行重写它。怎么样:

find /my/folder -name '*jpg' -print0 | parallel --progress -0 -j +0 "mogrify -resize 900\> {}"
Run Code Online (Sandbox Code Playgroud)

这将找到所有 jpeg 文件并并行运行它们。parallel 将并行运行与您拥有的 cpu 内核 ( -j +0)一样多的作业。

如果您正在处理大量文件,则可以通过像这样智能地批处理作业来节省大量时间。该--progress选项会在作业运行时显示一些详细信息。

-print0从find命令使用空分离输出,如果你在你的文件名空格或奇怪的字符。该-0选项以平行期望输入与null分隔。如果您确定输入文件名不包含空格,则可以省略-print0 / -0. 请注意,大多数版本的 xargs 也采用该-0选项,因此您可以将此技巧用于 xargs 以及并行。

编辑:从评论中我没有得到完全正确的命令。现在我实际上尝试使用它调整了 mogrify。不需要保存到新文件,因为默认情况下 mogrify 写入现有文件。