Bash:对 FIND 的结果执行命令

Bash:对 FIND 的结果执行命令

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

find /my/folder/ -name '*jpg' -exec 'mogrify -resize 900">"{}' \;

我尝试了很多其他方法,但都无济于事。哪里出了问题?

答案1

我不太喜欢在 find 上执行 exec,它有点古老而且难以预测,特别是当你给它输入所有的引号时:)

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

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

这里不同的地方

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

在 xargs 中

-0 表示输入由 NULL 字符分隔 -J% 表示 % 应该被输入中的内容替换(在本例中为文件名)

答案2

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

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

find /my/folder -name '*jpg' -print0 | parallel --progress -0 -j +0 "mogrify -resize 900\> {}"

这将找到所有 jpeg 文件并通过并行运行它们。并行将并行运行与 CPU 核心数一样多的作业(-j +0)。

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

find 命令中的-print0使用空字符分隔输出,以防文件名中有空格或奇怪的字符。parallel 选项-0要求输入以空字符分隔。如果您确定输入文件名不包含空格,则可以省略-print0 / -0。请注意,大多数版本的 xargs 也采用该-0选项,因此您可以将此技巧与 xargs 以及 parallel 一起使用。

编辑:从评论来看,我不太理解命令。现在我尝试使用 mogrify,并对其进行了调整。无需保存到新文件,因为 mogrify 默认写入现有文件。

答案3

编辑:抱歉,我刚刚意识到你的命令中那不是重定向。这是一条特殊指令mogrify

我会省略单引号并尝试这个:

find /my/folder/ -name '*jpg' -exec mogrify -resize 900">" {} \;

使用您发布的命令,您可能会收到类似以下的错误消息:

find: `mogrify -resize 900">"filename': No such file or directory.

原始答案:

为了使重定向工作,-exec您需要使用sh -c

find /my/folder/ -name '*jpg' -exec sh -c 'mogrify -resize 900 > "$@" ' _ {} \;

直到最近几天,我才开始看到有人质疑 的使用-exec。我还没看到有人具体指出它有什么问题。我有很多使用它的经验,它从来没有让我失望过。然而,有时它肯定xargs是有利的,因为它提供的控制和它同时传递多个参数的能力。然而,当你使用 时-I,它一次只传递一个参数。我在这里展示的命令确实有一个缺点,那就是为每个找到的文件调用 shell。

答案4

这里很古老,但是没有人说过一件简单的事情:

ls | xargs mogrify -resize 900

这也将处理当前目录中的所有文件,-good以执行 thunar 自定义操作,-quality xx并添加。

或者仅对选定的文件执行自定义操作:

mogrify-调整大小 900%F

相关内容