我怎样才能运行 mogrify,但要在文件名前加上前缀?

我怎样才能运行 mogrify,但要在文件名前加上前缀?

我在同一个目录中有 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}"    

相关内容