Como posso executar o mogrify, mas prefixar o nome do arquivo?

3

Eu tenho 300k + jpg no mesmo diretório. Os arquivos são como:

/covers    
0788862281217.jpg
0788863155104.jpg
7888311516341.jpg
7888370920479.jpg
7888497074277.jpg

Eu preciso redimensionar em lote salvando as imagens redimensionadas no mesmo diretório com um prefixo th _ no nome do arquivo como

th_0788862281217.jpg
th_0788863155104.jpg
th_7888311516341.jpg
th_7888370920479.jpg
th_7888497074277.jpg

tudo dentro de /covers

O seguinte funciona, mas sobrescreve os arquivos de origem

$ find thumbs -type f -name "*.jpg" | xargs mogrify -resize 75x75

então eu tenho que copiar todas as imagens em um novo dir (/ covers / thumbs) e, em seguida, executar o lote e, em seguida, mover todos os arquivos de volta para / covers

    
por Gabriele 19.05.2013 / 21:14

1 resposta

6

Do manual:

Mogrify overwrites the original image file, whereas, convert(1) writes to a different image file.

Você pode fazer:

find ./covers -type f -name '*.jpg' -execdir convert {} -resize 75x75 th_{} \;

Isso provavelmente será mais eficiente se você tiver um grande número de arquivos.

Em geral, por várias razões , é uma má idéia canalizar a saída de find to xargs , a menos que você use o seguinte padrão, que as variantes GNU e BSD find suportam: find … -print0 | xargs -0 …

Se você quiser usar comandos somente de shell, pode fazer um loop pelos arquivos da seguinte forma:

for image in ./covers/*.jpg; do convert "$image" -resize 75x75 "$(dirname $image)/th_$(basename $image)"; done

É o mais fácil (e seguro) que você pode obter, sem ter que recorrer a comandos externos. No entanto, você precisará dividir o caminho e o nome do arquivo e inserir o prefixo entre eles. Se você já está na mesma pasta, isso é muito mais fácil:

for i in *.jpg; do convert "$i" -resize 75x75 "th_$i"; done

Uma solução universal e mais curta com o Zsh:

for i (./covers/*.jpg) convert "$i" -resize 75x75 "${i:h}/th_${i:t}"    
    
por 19.05.2013 / 21:20