如何运行 mogrify,但在文件名前加上前缀?

Gab*_*ele 4 linux imagemagick

我在同一目录中有 300k+ jpg 文件。文件是这样的:

/covers    
0788862281217.jpg
0788863155104.jpg
7888311516341.jpg
7888370920479.jpg
7888497074277.jpg
Run Code Online (Sandbox Code Playgroud)

我需要批量调整大小,将调整大小的图像保存在同一目录中,文件名中带有前缀th_,例如

th_0788862281217.jpg
th_0788863155104.jpg
th_7888311516341.jpg
th_7888370920479.jpg
th_7888497074277.jpg
Run Code Online (Sandbox Code Playgroud)

都在里面 /covers

以下工作,但它覆盖了源文件

$ find thumbs -type f -name "*.jpg" | xargs mogrify -resize 75x75
Run Code Online (Sandbox Code Playgroud)

所以我必须将所有图像复制到一个新目录 (/covers/thumbs) 中,然后运行批处理,然后将所有文件移回 /covers

slh*_*hck 10

从手册:

Mogrify 覆盖原始图像文件,而 convert(1) 写入不同的图像文件。

你可以做:

find ./covers -type f -name '*.jpg' -execdir convert {} -resize 75x75 th_{} \;
Run Code Online (Sandbox Code Playgroud)

如果您有大量文件,这可能是最有效的。

在一般情况下,由于种种原因这是一个相当糟糕的主意,管的输出findxargs,除非您使用以下方式,其中GNU和BSDfind变体都支持:find … -print0 | xargs -0 …


如果你想使用 shell-only 命令,你可以像这样循环文件:

for image in ./covers/*.jpg; do convert "$image" -resize 75x75 "$(dirname $image)/th_$(basename $image)"; done
Run Code Online (Sandbox Code Playgroud)

这是您可以获得的最简单(也是最安全)的方法,无需求助于外部命令。但是,您需要拆分路径和文件名并在它们之间插入前缀。如果您已经在同一个文件夹中,这会容易得多:

for i in *.jpg; do convert "$i" -resize 75x75 "th_$i"; done
Run Code Online (Sandbox Code Playgroud)

Zsh 的通用且更短的解决方案:

for i (./covers/*.jpg) convert "$i" -resize 75x75 "${i:h}/th_${i:t}"    
Run Code Online (Sandbox Code Playgroud)