web-dev-qa-db-fra.com

Comment convertir récursivement et automatiquement tous les bmps en pngs dans un répertoire donné?

J'ai un répertoire sur ma machine avec des centaines d'images, environ la moitié de ces images sont des bmp, et l'autre moitié des pngs ... Je dois transformer tous les bmp en pngs, mais comme il y en a tellement Je ne veux pas le faire manuellement.

Alors, comment puis-je convertir récursivement et automatiquement (probablement à l'aide d'un script) tous les fichiers image bmp en fichiers image png dans ce répertoire?

J'utilise Ubuntu GNOME 15.10 avec GNOME 3.18.

4
user364819

Une simple boucle for peut suffire pour un seul répertoire:

for i in *.bmp
do 
convert $i "${i%.bmp}.png"
done

Pour rendre cela vraiment récursif, il y a quelques choix, une méthode est la suivante:

find . -name '*.bmp' -type f -exec bash -c 'convert "$0" "${0%.bmp}.png"' {} \;

Si vous souhaitez essayer un peu plus, spécifiez un niveau de qualité pour le niveau png en utilisant la syntaxe:

-quality value

Cela prend une valeur de 1 pour la qualité la plus basse et la plus petite taille de fichier à 100 pour la plus grande qualité et la plus grande taille. La valeur par défaut est environ 92. En outre détails ici ...

7
andrew.46

Je dirais que la réponse de andrew.46 est toujours la meilleure, étant donné que c'est un on-line éloquent. Cependant, voici une autre option. Le seul avantage est qu’il existe un "nombre de fichiers en cours" sur le "nombre total de fichiers" à convertir et que le fichier en cours de conversion est répercuté. Vous voudrez cependant supprimer tous les espaces dans les noms de fichiers avant de les exécuter. Cela supprimera les espaces: find . -name "* *" | rename 's/ /-/g'

#!/bin/bash

cd $(pwd)    
bmp_files=$(find . -iname "*.bmp")

total=$(echo "$bmp_files" | wc -l)
num=0

echo "There are $total files to be converted."

for f in $bmp_files
do
    ((num++))
    echo "Converting $f, $num/$total"   
    convert "$f" "${f%.bmp}.png" 
    clear
done
3
jbrock