如何在终端中递归地批量调整Ubuntu中的图像大小?

问题描述 投票:0回答:10

我在一组组织好的文件夹中存储了多个图像。我需要将这些图像的大小从其父目录递归调整为“特定百分比”。我正在运行 Ubuntu 11.10,我更喜欢学习如何直接从终端执行此操作。

image ubuntu imagemagick ubuntu-11.10
10个回答
88
投票
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%



9
投票

sudo apt install imagemagick sudo apt-get install nautilus-image-converter nautilus -q

用于调整当前文件夹中的图像大小/旋转。您只需安装,然后右键单击一个或多个图像并选择您想要的大小即可。 
nautilus -q

是停止鹦鹉螺。只需再次启动 nautilus,您就可以使用图像转换器了。

    


8
投票

如果图像所在的文件名或文件夹名称中有空格,则应将 -print0 与 find 一起使用,将 -0 与 xargs 一起使用,以避免任何解析错误。

find . -name "*.jpg" -print0 | xargs -0 convert -resize 50% find . -name "*.jpg" -print0 | xargs -0 mogrify -resize 50%



1
投票


convert $f.jpg -size 1024x768 $f.resized.png



1
投票

它将保持纵横比

$ 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

它将把图像大小调整为 45x60,而不保持当前目录中的宽高比。


1
投票

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 文件的路径。


1
投票

find -iname "*.jpg" -exec convert {} -resize 1280x1280 {} \;

(这是我的最大尺寸解决方案,但如果你想调整大小到百分比只需适应)

find -iname "*.jpg" -exec convert {} -resize 50% {} \;



0
投票

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/')' {} \;



0
投票

在与我对 Linux 的无知作斗争后(第一年),我终于找到了最适合我的解决方案:

使用ImageMagick;
  • 没有 XARGS;
  • 替换原文件;
  • 设置特定的宽度和高度最大值,保持宽高比(以下代码中的
  • 700
  • px); 包含字母大小写特定变体以避免遗漏;
  • 在所有子文件夹中递归搜索。
  • 这是终端的代码:

for f in `find . -name "*.jpg" -or -name "*.JPG" -or -name "*.jpeg" -or -name "*.JPEG"` ; do convert "$f" -resize 700 "$f" ; done

我希望它对你们很多人有帮助;无论如何,它已经保存下来以备我将来的需要。


0
投票

添加了一项检查,以在源文件具有较小宽度值时跳过调整大小。
  • 将“name”替换为“iname”以进行不区分大小写的搜索。
  • 添加了控制台日志记录
  • 将其包装为多行 shell 脚本
  • #!/bin/bash max_width=1000 find . -iname "*.jpg" -or -iname "*.JPEG" | while read -r f; do file_width=$(identify -format "%w" "$f") if [ "$file_width" -lt $max_width ]; then echo "$f" has width less than $max_width, skip resizing else convert "$f" -resize $max_width "$f" echo "$f" resized fi done
© www.soinside.com 2019 - 2024. All rights reserved.