我有多张图片存储在一组有组织的文件夹中。我需要从它们所在的父目录开始,递归地按特定百分比重新调整这些图像的大小。我正在运行Ubuntu 11.10,并且更喜欢直接从终端学习如何完成此操作。
我有多张图片存储在一组有组织的文件夹中。我需要从它们所在的父目录开始,递归地按特定百分比重新调整这些图像的大小。我正在运行Ubuntu 11.10,并且更喜欢直接从终端学习如何完成此操作。
您可以使用imagemagick。例如,如果要将当前目录下的所有JPG图像调整为其原始大小的50%,请执行以下操作:
for f in `find . -name "*.jpg"`
do
convert $f -resize 50% $f.resized.jpg
done
生成的文件名中会有两个“.jpg”字样,如果这是一个问题,您可以考虑以下替代方案。
要遍历/查找要调整大小的文件,您也可以使用xargs。例如:
find . -name "*.jpg" | xargs convert -resize 50%
这将创建图像的副本。如果您只想原地转换它们,您可以使用:
find . -name "*.jpg" | xargs mogrify -resize 50%
sudo apt install imagemagick
sudo apt-get install nautilus-image-converter
nautilus -q
对于在当前文件夹中调整/旋转图像。您只需安装,然后右键单击一个或多个图像并选择所需大小即可完成。 nautilus -q
是停止nautilus。只需重新启动nautilus,您就可以使用图像转换器。
扩展@betabandido的答案:
如果图像所在的文件名或文件夹名中有空格,则应使用 -print0 和 find 以及 -0 和 xargs 来避免任何解析错误。
find . -name "*.jpg" -print0 | xargs -0 convert -resize 50%
find . -name "*.jpg" -print0 | xargs -0 mogrify -resize 50%
quality
也可以:find . -name "*.jpg" -print0 | xargs -0 mogrify -quality 70%
- Diego Somarconvert $f.jpg -size 1024x768 $f.resized.png
虽然这是一个老问题,但我认为以下方法最简单,而且可以处理空格和非“标准”字符。
find -iname "*.jpg" -exec convert {} -resize 1280x1280 {} \;
这是我的解决方案,使用最大尺寸,但如果你想调整大小为百分比,只需适应即可。
find -iname "*.jpg" -exec convert {} -resize 50% {} \;
我稍微修改了被采纳的答案的代码,以包括png文件并在文件名中添加前缀而不是后缀,以便一次选择所有调整大小的文件更容易。
for p in `find . -name "*.jpg" -o -name "*.png"`
do
d=${p%/*}
f=${p##*/}
b=${f%.*}
e=${f##*.}
convert $p -resize 33% $d/thumb.$b.$e
done
通过一些修改,可以重新创建目录结构到一个单独的目录,并只保留具有相同目录结构的调整大小的文件。另一个选项是将目录结构展平,并使用随机生成的文件名,并通过每个缩略图文件进行路径映射并将其收集到CSV文件中。
$ convert dragon.gif -resize 64x64 resize_dragon.gif
$ convert dragon.gif -resize 64x64\! exact_dragon.gif
$ cat resize.sh
#!/bin/bash
for f in `find . -name "*.jpg"`
do
convert $f -resize 45x60\! $f.resize.jpg
done
有几个答案,例如:
find . -name "*.jpg" | xargs convert -resize 50%
这样做是行不通的,因为它会像这样扩展列表:
convert -resize 50% a.jpg b.jpg c.jpg
这将把 a.jpg
调整大小为 c-0.jpg
,b.jpg
调整大小为 c-1.jpg
,而让 c.jpg
不变。
因此,您必须为每个匹配执行调整大小命令,并提供输入文件名和输出文件名,类似于以下内容:
find . -name "*.jpg" | xargs -n 1 sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')'
find
的每个匹配项都会被单独传递给调整大小脚本 xargs -n 1
:sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')'
。
该脚本使用参数$0
接收文件名,并使用sed
通过替换原始的.jpg
后缀为-th.jpg
来生成输出文件名。
然后,它使用这两个文件名运行convert
命令。
以下是不使用xargs
而使用find -exec
的版本:
find -name '*.jpg' -exec sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')' {} \;
sh
,为每个JPEG创建一个新进程来执行sed
,并为每个JPEG创建一个新进程来执行convert
,如果您有大量图像,这将会很痛苦。我建议使用mogrify
,您只需要调用一次它就可以从单个进程处理所有图像,和/或使用GNU Parallel,或者至少使用shell参数替换来计算新文件名,而不是使用sed
。 - Mark Setchellmogrify
,你不需要想出一个第二个文件名,所有的复杂性都消失了。
我的观点是,与几个答案中所写的一样,mogrify
适用的方法在convert
中并不适用。 - loic.jaouenmogrify
和convert
并不能简单地互换使用。如果您愿意覆盖原始文件,那么mogrify
就可以完成所有任务。如果不想这么做,您需要使用convert
,这会变得有些混乱。去掉sed很好的建议:
find -name '*.jpg' -exec sh -c 'convert -resize 50% $0 "${0%\.jpg}-th.jpg"' {} \;
或者只需在前面加上:"th-${0}"在我看来,我不确定创建进程的成本与图像处理任务相比有多大影响……但我同意;既然没有必要,为什么要创建新的进程呢? - loic.jaouen在我与Linux的无知(第一年)苦苦挣扎了很多小时后,我终于找到了最适合我的解决方案:
这是终端的代码:
for f in `find . -name "*.jpg" -or -name "*.JPG" -or -name "*.jpeg" -or -name "*.JPEG"` ; do convert "$f" -resize 700 "$f" ; done
希望这对你们有所帮助;无论如何,它已经为我未来的需求保存了下来。
find . -name "*.jpg"
; do convertbasename $f .jpg
.jpg -resize x600basename $f .jpg
_resized.png; done</pre> - Thibaud Ruellecode
标记的方法,但您已经明白了…… - Thibaud Ruelle