如何对一组文件使用linux命令

如何对一组文件使用linux命令,linux,command-line,terminal,Linux,Command Line,Terminal,我正在寻找一种在linux下使用终端和命令“convert”转换一组文件的解决方案。我可以对每个文件使用“转换”: convert -quality 85 file.jpg file.jpg 但我在寻找类似的东西: for each jpg do convert -quality 85 $file $file end 有人能告诉我,我可以使用哪个命令吗 for i in *.jpg; do convert ... $i $i done 我应该这样做。这将适用于sh/bash/zs

我正在寻找一种在linux下使用终端和命令“convert”转换一组文件的解决方案。我可以对每个文件使用“转换”:

convert -quality 85 file.jpg file.jpg
但我在寻找类似的东西:

for each jpg do
  convert -quality 85 $file $file
end
有人能告诉我,我可以使用哪个命令吗

for i in *.jpg; do
   convert ... $i $i
done
我应该这样做。这将适用于sh/bash/zsh等。它假定所有的*.jpg文件都在当前目录中。否则,用适当的find调用替换*.jpg,例如

for i in `find . -name "*.jpg" -print`; do
注意背面的记号。这表明应该执行封闭的命令,并将结果返回到调用结构(在本例中为for循环)

如果你正在使用,那么你可以

for i in **/*.jpg; do

在通配符中搜索子目录,并使用进一步限定这些子目录。但是,我不确定bash在这方面提供了哪些功能。

如果您使用bash,可以执行以下操作:

$ for f in `ls path/to/jpegs/*.jpg`; do convert -quality 85 $f $f; done
它将循环遍历给定目录中的所有JPEG并转换它们


如果您没有使用Bash,那么shell可能具有类似的for循环语法;检查手册页。

我要写一个shell脚本。如果您不熟悉shell编程,请参阅

那怎么办

find [-maxdepth 1] -iname "*.jpg" -exec mogrify -quality 85 {} \;
  • 可选
    -maxdepth 1
    仅在当前目录下操作(无子目录)
  • ImageMagick附带了
    mogrify
    ,它可以在适当的位置修改文件

如果您有一台多核机器,您可以通过并行操作来获得一些真正的速度:

mkdir -p converted
find -iname '*.jpg' -print0 | xargs -0 -P<number of cores> -n1 -Ifoo convert -quality 85 foo converted/foo
mkdir-p已转换
查找-iname'*.jpg'-print0 | xargs-0-P-n1-Ifoo convert-quality 85 foo converted/foo

您可以使用其姊妹命令
mogrify
,就地编辑文件,而不是通过覆盖自身来转换每个文件。此外,这两个命令都内置了globbing,因此它们可以在一次调用中修改所有图像,这比每个图像运行一次程序要快。有关更多信息,请参阅

这样做可以:

mogrify '*.jpg' -quality 85

别忘了xargs。不一定像for循环那样强大,但知道它可用通常很方便:find-name'*.jpg'| xargs-l-i convert-quality 85{}{}ooh!我不知道你能用xargs做到这一点!我觉得自己更聪明了。或者,即使没有xargs,你也可以通过:find-名称“*.jpg”-exec convert-quality 85{}\:Bash 4.0,一旦您使用
shopt-s globstar
启用globstar shell选项,就会像Zsh一样对待*/.jpg。您可以使用$(…)而不是$(…),后者更清晰一些。'$files$files',而不是“$arg arg或者其他方式?
find . -name '*.jpg' -exec convert -quality 85 {} {} \;
mogrify '*.jpg' -quality 85