我在同一目录中有 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)
如果您有大量文件,这可能是最有效的。
在一般情况下,由于种种原因这是一个相当糟糕的主意,管的输出find来xargs,除非您使用以下方式,其中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)