2009-06-30 6 views
3

Je cherche une solution pour convertir un ensemble de fichiers en utilisant le terminal et la commande "convertir" sous linux. Je peux utiliser « convertir » pour chaque fichier:Comment utiliser une commande linux pour un ensemble de fichiers

convert -quality 85 file.jpg file.jpg 

Mais je cherche quelque chose comme:

for each jpg do 
    convert -quality 85 $file $file 
end 

que quelqu'un peut me dire quelle commande je peux utiliser?

Répondre

11
for i in *.jpg; do 
    convert ... $i $i 
done 

devrait le faire. Cela fonctionnera pour sh/bash/zsh, etc. Cela suppose que tous vos fichiers * .jpg se trouvent dans le répertoire courant. Sinon, remplacez * .jpg par un appel de recherche approprié, par ex.

for i in `find . -name "*.jpg" -print`; do 

Notez les guillemets. Ceux-ci indiquent que la commande ci-joint doit être exécuté, et les résultats retournés à la structure invocateur (dans ce cas, la boucle for)

Si vous utilisez zsh, alors vous pouvez le faire

for i in **/*.jpg; do 

à recherchez des sous-répertoires dans votre caractère générique, et qualifiez-les davantage en utilisant advanced zsh wildcard syntax. Cependant, je ne suis pas sûr de ce que les installations offrent dans ce domaine.

+0

merci beaucoup – cupakob

+3

Ne pas oublier xargs. Pas forcément aussi puissant qu'une boucle for, mais souvent utile de savoir qu'il est disponible: find -name '* .jpg' | xargs -l -i convert -quality 85 {} {} – opello

+0

ooh! Je ne savais pas que tu pouvais faire ça avec xargs! Je me sens plus malin. –

4

Si vous utilisez Bash, vous pouvez faire quelque chose comme ce qui suit:

$ for f in `ls path/to/jpegs/*.jpg`; do convert -quality 85 $f $f; done 

qui boucle à travers tous les fichiers JPEG dans un répertoire donné et de les convertir.

Si vous n'utilisez pas Bash, votre shell peut avoir une syntaxe for-loop similaire; Vérifiez les pages de manuel.

+1

Toujours bon d'exposer la version mono-ligne. – dmckee

1

J'écrirais un script shell. Si vous n'êtes pas familier avec la programmation shell, voir this page.

#!/bin/sh 

for arg in `ls *.jpg` 
do 
    convert -quality 85 $arg $arg 
done 
+1

'$ files $ files', pas '$ arg $ arg' ou l'inverse peut-être? –

+0

@Joakim Elofsson - Bonne prise, merci! –

0

Qu'en est-il de? :

find [-maxdepth 1] -iname "*.jpg" -exec mogrify -quality 85 {} \; 
  • option -maxdepth 1 pour fonctionner sur le répertoire courant que
  • ImageMagick est livré avec mogrify, qui modifie les fichiers en place (pas subdir.).
3

Si vous avez une machine à multi-cœurs, vous pouvez obtenir une vitesse réelle en les faisant en parallèle:

mkdir -p converted 
find -iname '*.jpg' -print0 | xargs -0 -P<number of cores> -n1 -Ifoo convert -quality 85 foo converted/foo 
0
find . -name '*.jpg' -exec convert -quality 85 {} {} \; 
5

Au lieu de convert ing chaque fichier par lui-même d'écraser, vous pouvez utiliser sa soeur commande mogrify, qui modifie le fichier en place. De plus, les deux commandes intègrent la globalisation, ce qui leur permet de modifier toutes les images en un seul appel, ce qui est plus rapide que d'exécuter le programme une fois par image. Voir ImageMagick Command Line Processing pour plus d'informations.

Donc cela va faire:

mogrify '*.jpg' -quality 85 
Questions connexes