我正在寻找一个解决方案,使用终端和linux下的命令“convert”转换一组文件。我可以为每个文件使用“convert”:
convert -quality 85 file.jpg file.jpg
但我正在寻找类似的东西:
for each jpg do
convert -quality 85 $file $file
end
有人可以告诉我,我可以使用哪个命令?
答案 0 :(得分:11)
for i in *.jpg; do
convert ... $i $i
done
应该这样做。这适用于sh / bash / zsh等。它假定您的所有* .jpg文件都在当前目录中。否则,将* .jpg替换为适当的查找调用,例如
for i in `find . -name "*.jpg" -print`; do
注意反引号。这些表明应该执行封闭的命令,并将结果返回给调用结构(在本例中为for循环)
如果您使用的是zsh,那么您可以
for i in **/*.jpg; do
搜索通配符中的子目录,并使用advanced zsh wildcard syntax进一步限定这些子目录。但是我不确定bash在这个区域提供什么设施。
答案 1 :(得分:5)
通过覆盖自身来代替convert
每个文件,您可以使用其姐妹命令mogrify
来编辑文件。此外,这两个命令都有内置的globbing,因此它们可以在一次调用中修改所有图像,这比每个图像运行一次程序要快。有关详细信息,请参阅ImageMagick Command Line Processing。
所以这样做:
mogrify '*.jpg' -quality 85
答案 2 :(得分:4)
如果您正在使用Bash,则可以执行以下操作:
$ for f in `ls path/to/jpegs/*.jpg`; do convert -quality 85 $f $f; done
这将遍历给定目录中的所有JPEG并转换它们。
如果你没有使用Bash,你的shell可能有类似的for循环语法;查看手册页。
答案 3 :(得分:3)
如果您有多核机器,您可以通过并行执行它们来获得一些真正的速度:
mkdir -p converted
find -iname '*.jpg' -print0 | xargs -0 -P<number of cores> -n1 -Ifoo convert -quality 85 foo converted/foo
答案 4 :(得分:1)
我写了一个shell脚本。如果您不熟悉shell编程,请参阅this page。
#!/bin/sh
for arg in `ls *.jpg`
do
convert -quality 85 $arg $arg
done
答案 5 :(得分:0)
怎么样? :
find [-maxdepth 1] -iname "*.jpg" -exec mogrify -quality 85 {} \;
-maxdepth 1
仅对当前目录(无子目录。)mogrify
,可以修改文件。答案 6 :(得分:0)
find . -name '*.jpg' -exec convert -quality 85 {} {} \;