Pastas de processamento em lote com 'find' e 'montagem' do imagemagick

1

Então eu tenho trabalhado nisso por um tempo e acho que estou pronto para desistir. Estou tentando processar subpastas com montage do imagemagick para criar folhas de contato.

Isso é basicamente o mais perto que eu cheguei:

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

Usando este comando, o Montage processa cada imagem individualmente. O comportamento que eu quero é encontrar para procurar o diretório mais baixo para fotos, fazer backup, enviar tudo para montage e, em seguida, continuar na próxima pasta com a folha de contatos resultante nomeada com a árvore de pastas inteira.

ou seja:

#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 \;

Algumas outras coisas que tentei criar são:

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

A estrutura de diretórios é algo como:

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

Executando o Ubuntu 14.10

Qualquer ajuda sobre isso seria muito apreciada.

    
por sparkles 01.02.2015 / 19:23

1 resposta

2

Eu tive um problema semelhante, mas sem as pastas na parte do nome do arquivo. Abaixo está um script que faz o que você está pedindo. Altere base para sua pasta inicial. O montage use as opções -geometry para definir o tamanho do bloco em px «width» x «height» e -tile para o número de blocos «colunas» x «linhas».

#!/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
    
por perdigueiro 20.03.2015 / 19:07