我在同一个目录中有 300k+ jpg 文件。文件如下:
/covers
0788862281217.jpg
0788863155104.jpg
7888311516341.jpg
7888370920479.jpg
7888497074277.jpg
我需要批量调整大小并保存调整大小后的图像同一目录带有前缀th_在文件名中
th_0788862281217.jpg
th_0788863155104.jpg
th_7888311516341.jpg
th_7888370920479.jpg
th_7888497074277.jpg
全部都在里面/covers
以下操作有效,但它会覆盖源文件
$ find thumbs -type f -name "*.jpg" | xargs mogrify -resize 75x75
所以我必须将所有图像复制到新目录 (/covers/thumbs),然后运行批处理,然后将所有文件移回 /covers
答案1
来自手册:
Mogrify 覆盖原始图像文件,而 convert(1) 写入不同的图像文件。
你可以做:
find ./covers -type f -name '*.jpg' -execdir convert {} -resize 75x75 th_{} \;
如果您有大量文件,这可能是最有效的。
一般来说,由于各种原因find
将的输出通过管道传输到 是一个非常糟糕的想法xargs
,除非您使用以下模式(GNU 和 BSDfind
变体支持该模式):find … -print0 | xargs -0 …
如果您想要使用仅限 shell 的命令,您可以像这样循环遍历文件:
for image in ./covers/*.jpg; do convert "$image" -resize 75x75 "$(dirname $image)/th_$(basename $image)"; done
这是最简单(也是最安全)的方法,无需借助外部命令。不过,您需要拆分路径和文件名,并在两者之间插入前缀。如果您已经在同一个文件夹中,那么这会更容易:
for i in *.jpg; do convert "$i" -resize 75x75 "th_$i"; done
使用 Zsh 的通用且更短的解决方案:
for i (./covers/*.jpg) convert "$i" -resize 75x75 "${i:h}/th_${i:t}"