我正在尝试调整使用 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