compactação em lote JPG e renomeação (find -exec, xargs, piping?)

3

este é o meu primeiro post, então espero que você seja gentil o suficiente para me perdoar se eu cometer erros de formatação ou algo assim. Esta é uma pergunta que eu tenho há bastante tempo e, enquanto procuro por respostas, tenho mais perguntas surgindo. Eu estava tentando encontrar uma maneira de compactar imagens em uma pasta usando convert em um comando.

Primeiro eu simplesmente tentei:

convert * -resize 50% Pic.jpg

No entanto, isso retornou as imagens compactadas chamadas Pic-0.jpg, Pic-1.jpg, etc. (Eu também tentei $(find ".JPG") em vez de * , mas isso é expandido para o mesmo. A fim de ter a formatação Eu queria que eu tentasse:

convert * -resize 50% Pic_lorez_{1..3}.jpg

Mas isso pareceu levar o Pic_lorez_2.jpg e o Pic3_lorez_3.jpg como arquivos de entrada, não arquivos de saída. Então, seguindo o conselho de um amigo, eu tentei:

find . -name "*.JPG" -exec convert {} -resize 50% {} \;

Isso comprime todos os arquivos com o mesmo nome, mas não permite colocar o nome que eu quero para esses arquivos (por exemplo, Pic_lorez_ {1,2,3,4,5, .. 100} .jpg). / p>

Os xargs tornariam isso possível? Algo ao longo das linhas de:

find . -name "*.JPG" | xargs convert ???

Não consegui descobrir a sintaxe adequada com xargs. Eu finalmente tentei um canal direto de conversão, mas convertido não parece ser capaz de trabalhar dessa maneira.

    
por Huria 14.04.2013 / 20:18

5 respostas

7

convert grava em um arquivo de imagem diferente. Para substituir arquivos de imagem originais, use mogrify .

Arquivo único:

mogrify -resize 50% Pic.jpg 

Todos os arquivos .jpg :

mogrify -resize 50% *.jpg
    
por Nykakin 14.04.2013 / 20:59
4

Você poderia usar este forro: for img in $(ls *.jpg); do convert $img -resize 50% $img;done;

    
por Stef K 14.04.2013 / 21:03
1

Tente isto:

SIZE=50 ; find -iname "*.jpg" | while read line ; do NF="$(echo $line | sed -r "s/(\.jpg|\.JPG)/_$SIZE/")" ; convert "$line" -resize $SIZE% "$NF" ; done

Isso não é apenas uma linha. Aqui está uma versão recuada:

SIZE=50
find -iname "*.jpg" | while read line ; do
  NF="$(echo $line | sed -r "s/(\.jpg|\.JPG)/_$SIZE/")"
  convert "$line" -resize $SIZE% "$NF"
done

Você pode ajustar o valor de SIZE para qualquer outro tamanho, em porcentagem.

Por favor note que após a primeira execução, os arquivos já convertidos serão convertidos como arquivos de entrada. Você pode ignorar arquivos com o nome _NUMBER.jpg modificando o parâmetro find ou também armazenar os arquivos convertidos em outro lugar.

    
por Jorge Suárez de Lis 14.04.2013 / 20:58
1

Este script fará isso por você!

Salve em um arquivo e torne o arquivo executável com: chmod +x filename .

#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
C=0;
DES="./";       # Destination directory

for img in 'find . -maxdepth 1 -mindepth 1 -iname '*.jpg' -type f'
do
    (( ++C ));
    NF="${DES}Pic_lorez_${C}.jpg";      # New file name
    convert $img -resize 50% $NF;
done

# restore $IFS
IFS=$SAVEIFS
  • Altere o ./ para o diretório em que você deseja colocar as imagens convertidas, por padrão, ele as colocará no diretório atual.
  • Altere Pic_lorez_ para qualquer nome que você queira dar aos arquivos convertidos.
por Basharat Sialvi 14.04.2013 / 23:17
1

Use o Paralelo GNU:

find -iname "*.jpg" | parallel convert {} -resize 50% {.}_50pct.jpg

e receba a vantagem adicional de ter todos os núcleos da CPU funcionando em paralelo e, assim, acelerar o processo.

10 segundos de instalação:

wget pi.dk/3 -qO - | sh -x

Assista aos vídeos de introdução para saber mais: link

    
por Ole Tange 20.04.2013 / 17:37