Bash:对FIND的结果执行命令

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

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

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

我不喜欢高pipefind很多,这是有点古老和不可预知的,特别是当你喂它所有的报价:)

尝试使用xargs,它应该performance得更加文明

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

事情在这里是不同的

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

在xargs

-0告诉input由NULL分隔-j%表示%应该被input中的内容replace(在这个例子中是文件名)

@lynxman钉住了find / xargs的传统build议。 不过另一种方法是使用gnu并行查找。 Parallel为xargs提供了一些简洁的增强,如更复杂的参数处理和并行运行多个作业的能力(我认识到一些更新版本的xargs也支持并行作业)。

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

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

这将find所有的jpeg文件并通过并行运行。 并行将运行尽可能多的作业,因为你有cpu核心( -j +0 )。

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

-print0命令中的-print0使用空值来分隔输出,以防文件名中包含空格或奇怪的字符。 并行的-0选项需要用空值分隔的input。 如果您确定您的input文件名不包含空格,则可以省略-print0 / -0 。 请注意,大多数版本的xargs也采用-0选项,所以你可以用xargs和并行来使用这个技巧。

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

编辑:对不起,我刚刚意识到这不是你的命令redirect。 这是一个特殊的指导,以便mogrify

我会省略单引号,试试这个:

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

使用你发布的命令,你可能会得到如下的错误信息:

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

原始答案:

要使redirect在-exec内工作,您需要使用sh -c

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

只是在最近几天才开始看到人们质疑使用-exec 。 我没有看到任何人具体说这有什么问题。 我有很多使用它的经验,从来没有失败过我。 然而,有时候xargs是绝对有利的,因为它提供的控制和它同时传递多个参数的能力。 但是,当您使用-I ,它一次只传递一个参数。 我在这里显示的命令确实有调用每个find的文件的shell的缺点。

它在这里老了,但没有人说一句简单的话:

ls | xargs mogrify -resize 900

这将处理当前目录中的所有文件 – 也适用于thunar自定义操作,也可以添加-quality xx

或者只对所选文件进行自定义操作:

mogrify -resize 900%F