使用 `find` 和 imagemagick 的 `montage` 批处理文件夹

使用 `find` 和 imagemagick 的 `montage` 批处理文件夹

我已经研究了一段时间了,我想我准备放弃了。我尝试使用 imagemagick 处理子文件夹montage以创建联系表。

这基本上是我所得到的最接近的结果:

find '/dir-with-spaces/' -type f -regex ".*\.\(JPG\|jpg\|jpeg\|JPEG\)" -print0 | \
     while IFS= read -r -d $'\0' line;\
       do \
         montage "$line" "${line}".jpg; \
       done

使用此命令,Montage 会单独处理每张图片。我想要的行为是 find 会搜索最低目录中的图片、备份、发送所有图片montage,然后继续搜索下一个文件夹,并根据整个文件夹树的名称生成联系表。

IE:

/media/pictures/folder1/folder2/pic1.jpg...pic100.jpg --> media-pictures-folder1-folder2.jpg

我尝试想出的其他一些事情是:

#This just hangs montage forever
find . -name *.jpg -printf '%h\n' | sort -u | xargs -I {} montage {}/*

#I need a "+" here for -execdir, but I don't think I can use it with montage's argument structure.
find . -name *.jpg -execdir montage {} test.jpg \;

目录结构如下:

folder1
  folder1_1
    folder1_2
      folder1_3
        *.jpg
folder2
  folder2_1
    *.jpg
folder3
  folder3_1
    folder3_2
      folder3_4
        folder3_5
          *.jpg

运行 Ubuntu 14.10

任何帮助都将不胜感激。

答案1

我遇到过类似的问题,但没有文件夹的文件名部分。下面是一个可以执行您要求的脚本。更改base为您的起始文件夹。montage使用选项-geometry以 px 为单位设置图块大小“宽度”x“高度”,-tile图块数量为“列”x“行”。

#!/bin/bash -eu

base="/usr/share/icons/hicolor"
find "$base" -type d | while read fld
do
  [ $fld == $base ] && continue
  echo ">>> $fld"
  aux="${fld//\//_}"
  aux="${aux:1}"
  find "$fld" -type f -maxdepth 1 -iregex ".*\.\(jpg\|jpeg\|gif\|svg\|png\)" > "/tmp/${aux}.txt"

  if [ -s "/tmp/${aux}.txt" ]
  then
    montage "@/tmp/${aux}.txt" -geometry 64x -tile 3x "${aux}.jpg"
  fi
  rm "/tmp/${aux}.txt"
done

相关内容