Cela peut également être fait avec xargs
et sed
pour changer l'extension du fichier.
ls | grep \.png$ | sed 'p;s/\.png/\.jpg/' | xargs -n2 mv
Vous pouvez imprimer le nom de fichier d'origine avec ce que vous voulez que le nom de fichier soit. Demandez ensuite à xargs d'utiliser ces deux arguments dans la commande move. Pour le one-liner, j'ai également ajouté un grep pour filtrer tout ce qui n'est pas un fichier *.png.
comment renommer le fichier pour n'avoir qu'une seule extension.
cd dir/with/messedup/files
for file in *.png.jpg; do
mv "$file" "${file%.png.jpg}.jpg"
done
à l'avenir, en utilisant xargs, comment changer l'extension du fichier simular en deuxième commande ?
A ma connaissance, cela ne peut pas se faire. La meilleure façon de le faire serait d'utiliser une boucle for avec substitution de paramètre un peu comme celle ci-dessus :
for file in *.png; do
convert "$file" -resize "${file%.png}.jpg"
done
Si vous avez des fichiers dans des sous-répertoires que vous souhaitez convertir, vous pouvez diriger find
à un while read
boucle :
find . -type f -name '*.png' |
while read file; do
convert "$file" -resize "${file%.png}.jpg"
done
REMARQUE : Il est généralement considéré comme une mauvaise idée d'utiliser la sortie de ls
dans un script shell. Bien que votre exemple ait pu bien fonctionner, il y a beaucoup d'exemples où ce n'est pas le cas. Par exemple, si vos noms de fichiers contiennent des retours à la ligne (ce que Unix autorise), ls
n'y échappera probablement pas pour vous. (Cela dépend en fait de votre implémentation, ce qui est une autre raison de ne pas utiliser ls
dans les scripts ; son comportement varie considérablement d'une boîte à l'autre.) Vous obtiendrez des résultats plus cohérents si vous utilisez soit find
dans une boucle while-read ou un globbing de fichier (par exemple *.png
) dans une boucle for.