Comment redimensionner les images par lots dans Ubuntu récursivement dans le terminal?
J'ai plusieurs images stockées dans un ensemble de dossiers organisés. J'ai besoin de redimensionner ces images à un pourcentage spécifique récursivement de leur répertoire parent. Je cours Ubuntu 11.10 et je préfère apprendre à le faire directement à partir du terminal.
7 réponses
Vous pouvez utiliser imagemagick. Par exemple, pour redimensionner toutes les images JPG sous le répertoire courant à 50% de leur taille d'origine, vous pouvez faire:
for f in `find . -name "*.jpg"`
do
convert $f -resize 50% $f.resized.jpg
done
Les fichiers résultants auront ".jpg" deux fois dans leurs noms. Si c'est un problème, vous pouvez vérifier les solutions suivantes.
Pour parcourir/trouver les fichiers à redimensionner, vous pouvez également utiliser xargs . Exemple:
find . -name "*.jpg" | xargs convert -resize 50%
Cela va créer des copies des images. Si vous voulez juste les convertir au lieu de, vous pouvez utiliser:
find . -name "*.jpg" | xargs mogrify -resize 50%
Étendre la réponse de @betabandido
Dans le cas où il y a des espaces dans les noms de fichiers ou les noms de dossiers dans lesquels les images sont, alors il faut utiliser -print0 avec find et -0 avec xargs pour éviter toute erreur d'analyse.
find . -name "*.jpg" -print0 | xargs -0 convert -resize 50%
find . -name "*.jpg" -print0 | xargs -0 mogrify -resize 50%
Cela fonctionne également si vous donnez la nouvelle résolution de redimensionnement :
convert $f.jpg -size 1024x768 $f.resized.png
Vous pouvez également utiliser
sudo apt-get install nautilus-image-converter
Mais cela ne fonctionne que pour l'image dans le dossier actuel. Vous venez d'installer, puis faites un clic droit sur une image ou plusieurs et choisissez la taille que vous voulez et c'est tout.
Je crois que cela utilise également imagemagick.
Vous pouvez utiliser l'outil imagemagick pour le redimensionnement par lots.
Il maintiendra le rapport d'aspect
$ convert dragon.gif -resize 64x64 resize_dragon.gif
Il ne conservera pas le rapport d'aspect
$ convert dragon.gif -resize 64x64\! exact_dragon.gif
$ cat resize.sh
#!/bin/bash
for f in `find . -name "*.jpg"`
do
convert $f -resize 45x60\! $f.resize.jpg
done
Il redimensionnera l'image à 45x60 sans maintenir le rapport d'aspect dans le répertoire courant.
Il y a quelques réponses comme:
find . -name "*.jpg" | xargs convert -resize 50%
Cela ne fonctionnera pas car cela élargira la liste comme ceci:
convert -resize 50% a.jpg b.jpg c.jpg
, qui va redimensionner a.jpg
dans c-0.jpg
, b.jpg
dans c-1.jpg
et laissez - c.jpg
intacte.
Vous devez donc exécuter la commande redimensionner pour chaque correspondance, et donner à la fois le nom du fichier d'entrée et le nom du fichier de sortie, avec quelque chose comme:
find . -name "*.jpg" | xargs -n 1 sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')'
Chaque correspondance de find
est transmise individuellement par xargs -n 1
au script de redimensionnement: sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')'
.
Ce script reçoit le nom du fichier dans l'argument $0
, utilise sed
pour créer un nom de fichier de sortie en remplaçant le suffixe .jpg
d'origine par un suffixe -th.jpg
.
Et il exécute la commande convert
avec ces deux noms de fichiers.
Voici la version sans xargs
Mais find -exec
:
find -name '*.jpg' -exec sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')' {} \;
Vous pouvez copier/coller ce code dans ubuntu, et l'Enregistrer sous "resize.sh"
#!/ bin / bash-e
CUR_DIR= ' pwd '
Cd $ 1
#redimensionner
Pour le fichier dans *.jpg;
Do
Convertir $fichier -redimensionner 50% $fichier;
Fait
Cd $ CUR_DIR