web-dev-qa-db-fra.com

Compression et renommage par lots JPG (find -exec, xargs, piping?)

c’est mon premier article, j’espère que vous aurez l’amabilité de me pardonner si je commets des erreurs de formatage ou autre. C’est une question que je me pose depuis assez longtemps et lorsque je cherche des réponses, j’ai d’autres questions à poser. J'essayais de trouver un moyen de compresser des images dans un dossier en utilisant convert dans une commande.

D'abord j'ai simplement essayé:

convert * -resize 50% Pic.jpg

Cependant, cela renvoyait les images compressées nommées Pic-0.jpg, Pic-1.jpg, etc. (j'ai aussi essayé $(find ".JPG") au lieu de *, mais cela a été étendu de la même manière.

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

Mais cela semblait prendre les Pic_lorez_2.jpg et Pic3_lorez_3.jpg comme fichiers d'entrée, pas comme fichiers de sortie. Alors, suivant les conseils d'un ami, j'ai essayé:

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

Ceci compresse tous les fichiers sous le même nom mais ne permet pas de mettre le nom que je veux sur ces fichiers (par exemple, Pic_lorez_ {1,2,3,4,5, .. 100} .jpg).

Xargs le rendrait-il possible? Quelque chose dans le genre de:

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

Je ne pouvais pas comprendre la syntaxe appropriée avec xargs. J'ai finalement essayé une conversion directe de converti, mais ce dernier ne semblait pas pouvoir fonctionner de cette façon.

4
Huria

convert écrit dans un fichier image différent. Pour écraser les fichiers d’image originaux, utilisez mogrify.

Un seul fichier:

mogrify -resize 50% Pic.jpg 

Tous les fichiers .jpg:

mogrify -resize 50% *.jpg
7
Nykakin

Vous pouvez utiliser cette doublure: for img in $(ls *.jpg); do convert $img -resize 50% $img;done;

4
Stef K

Essaye ça:

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

Ce n'est vraiment pas une ligne. Voici une version en retrait:

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

Vous pouvez ajuster la valeur de SIZE à n’importe quelle autre taille, en pourcentage.

Veuillez noter qu'après la première exécution, les fichiers déjà convertis seront également considérés comme des fichiers d'entrée. Vous pouvez ignorer des fichiers portant le nom _NUMBER.jpg en modifiant le paramètre find ou vous pouvez également stocker les fichiers convertis ailleurs.

1

Ce script le fera pour vous!

Enregistrez-le dans un fichier et rendez-le exécutable avec: chmod +x filename.

 #!/bin/bash 
 SAVEIFS = $ IFS 
 IFS = $ (écho -fr "\ n\b") 
 C = 0; 
 DES = "./"; # Répertoire de destination 
 
 Pour img dans `find. -maxdepth 1 -mindepth 1 -iname '* .jpg' -type f` 
 do 
 ((++ C)); 
 NF = "$ {DES} Pic_lorez_ $ {C} .jpg "; # Nouveau nom de fichier 
 Convertir $ img -resize 50% $ NF; 
 Terminé 
 
 # Restaurer $ IFS 
 IFS = $ SAVEIFS 
  • Remplacez le ./ par le répertoire dans lequel vous voulez placer les images converties. Par défaut, elles seront placées dans le répertoire actuel.
  • Remplacez Pic_lorez_ par le nom que vous souhaitez attribuer aux fichiers convertis.
1
Basharat Sialvi

Utilisez GNU Parallel:

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

et bénéficiez du fait que tous vos cœurs de processeur fonctionnent en parallèle, ce qui accélère le processus.

10 secondes d'installation:

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

Regardez les vidéos d'introduction pour en savoir plus: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

1
Ole Tange