我经常使用 for 循环来转换一堆文件格式。在某些情况下,当发生文本转换或变量时,最好检查替换是否正确执行。
for i in *; do convert $i ${i%jpg}png; done
有没有一种简单的方法来显示执行的命令?按照上面的例子,大致如下:
convert image1.jpg image1.png
# command output
convert image2.jpg image2.png
# command output
# ...
答案1
set -x
for file in *jpg; do
convert "${file}" "${file%jpg}png"
done
set +x
设置-x
shell 选项将显示每个已执行的命令,因为它被设置为在所有参数扩展完成后执行。 +x
撤消此操作。
答案2
对于这种事情,我也使用该xtrace
选项(用set -x
// set -o xtrace
/ setopt xtrace
...设置options[xtrace]=on
),但在子 shell 中:
(set -x; for f (*.jpg) convert -- $f $f:r.png)
(这也使得工作控制更加清晰,并且顺便避免了该变量污染环境$f
)。
要在本地设置选项而不创建子 shell,您还可以使用匿名函数和localoptions
选项。
(){ set -o localoptions -x; for f (*.jpg) convert -- $f $f:r.png; }
(并添加 alocal f
使其$f
成为该匿名函数的本地函数)。
for f (*.jpg) (set -x; convert -- $f $f:r.png)
会让它变得不那么冗长(并节省一个进程)。
然而,在 ImageMagick 图像转换的情况下,您可以这样做:
$ mogrify -verbose -format png -- *.jpg
a.jpg JPEG 3264x1836 3264x1836+0+0 8-bit sRGB 2.07201MiB 0.050u 0:00.053
a.jpg=>a.png JPEG 3264x1836 3264x1836+0+0 8-bit sRGB 7.69297MiB 2.680u 0:02.640
b.jpg JPEG 3264x1836 3264x1836+0+0 8-bit sRGB 2.07201MiB 0.060u 0:00.050
b.jpg=>b.png JPEG 3264x1836 3264x1836+0+0 8-bit sRGB 7.69297MiB 2.650u 0:02.617