当一边太大时批量调整图像大小(linux)

时间:2018-01-29 14:22:26

标签: bash imagemagick recursive-query

我知道在命令行上调整图像大小是ImageMagick和类似的事情,遗憾的是我只有非常基本的bash脚本功能,所以我想知道这是否可能:

  • 检查所有图像文件
  • 的所有目录和子目录
  • 检查图像的宽度和高度
  • 如果两者中的任何一个超过X像素数量,则在保持纵横比的同时将其大小调整为X.
  • 用新文件替换旧文件(旧文件将被删除/删除)

感谢您的任何意见。

2 个答案:

答案 0 :(得分:1)

即使对于高级用户来说,实现也不是那么简单。作为单线:

  find \                                         # 1
    ~/Downloads \                                # 2
    -type f \                                    # 3
    -exec file \{\} \; \                         # 4
| awk -F: '{if ($2 ~/image/) print $1}' \        # 5
| while IFS= read -r file_path; do \             # 6
    mogrify -resize 1024x1024\> "$file_path"; \  # 7
  done                                           # 8

第1-4行是find命令的调用:

  1. 指定要扫描的目录。
  2. 指定您仅需要文件。
  3. 每个找到的项目运行file命令。每个文件的示例输出:

    • /Downloads/391A6 625.png: PNG image data, 1024 x 810, 8-bit/color RGB, interlaced
    • /Downloads/STRUCTURED NODES IN UML 2.0 ACTIVITES.pdf: PDF document, version 1.4

    请注意,文件名如何用:与信息分隔,有关PNG的信息包含image字。其他图像格式也是如此。

  4. 使用awk仅过滤信息中带有image词的那些文件。这仅给我们图像文件。在此,-F:指定分隔符为:。这为我们提供了变量$1来包含原始文件名,变量$2来包含文件信息。我们在文件信息中搜索image单词并打印文件名(如果存在)。

  5. 这有点棘手。第6-8行逐行读取awk的输出,并调用mogrify命令调整图像大小。这里我们不使用管道和xargs,就好像文件路径包含空格或其他必须转义的字符一样, 我们将收到xargs unterminated quote个错误,很难解决。
  6. 调用ImageMagic的mogrify命令。与convert也是ImageMagic的命令不同,mogrify可以在不创建新文件的情况下就地更改文件。在这里,1024x1024\>告诉您调整图像大小以使其最大尺寸为1024x1024\>部分告诉您保留长宽比,以便最终图像的最大边为1024px。除非原始图像是正方形的,否则另一边会小于该边。请注意;,因为它在循环中是必需的。

请注意,在同一文件上运行mogrify多次是安全的:如果文件的大小已经与您的目标尺寸相对应,则不会再次调整大小。但是,它会更改文件的修改时间。

此外,您可能不仅需要调整图像大小,还需要压缩它们。请参阅我的要旨以了解如何完成此操作:https://gist.github.com/oblalex/79fa3f85f05924017d25004496493adb

如果您的目标只是缩小大尺寸图像,例如大于300K,您可以:

  • find /path/to/dir -type f -size +300k
  • 和以前一样,将其与mogrify -strip -interlace Plane -format jpg -quality 85 -define jpeg:extent=300KB "$FILE_PATH"
  • 组合

在这种情况下,将为非jpg的原始文件创建新的jpg文件,并且需要删除原始文件。请参阅要点,以了解如何完成此操作。

答案 1 :(得分:0)

您可以使用循环遍历目录的bash unix shell脚本来实现。您必须标识所需的所有文件格式,例如jpg和png等。然后,对于每个目录,循环遍历给定格式列表的每个文件。然后使用ImageMagick调整文件大小。

cd
dirlist="path2/directory1 path2/directory2 ...."
for dir in $dirlist; do
cd "$dir"
imglist=`ls | grep -i ".jpg\|.png"`
for img in $imglist; do
convert $img -resize "200x200>" $img
done
done

请参阅https://www.imagemagick.org/script/command-line-processing.php#geometry