Donnez à tous les fichiers une extension .jpg

8

J'ai un répertoire et certaines extensions des fichiers sont en majuscules (.JPG) au lieu de minuscules.

Je veux m'assurer que chaque fichier a l'extension .jpg. Comment pourrais-je faire cela à partir d'une invite du shell?

Mark Flint
la source
C'est dommage que Linux ne dispose pas d'AppleScript.
gadgetmo
2
C'est tellement génial que Linux n'a pas d'AppleScript.
math

Réponses:

15

Utilisation de l' extension des paramètres du shell :

for f in *.JPG; do
    mv "${f}" "${f%%.JPG}.jpg"
done

Les "personnages prendront soin des noms de fichiers contenant des espaces, comme le font souvent les photographies.

Johnsyweb
la source
5
+1 Cette solution fonctionne même si vous avez des espaces dans le nom de fichier, mais vous voulez dire "$ f" au lieu de "f".
Adam Zalcman
L'expansion des paramètres de Shell est un peu cryptique, on pourrait utiliser le nom de base à la place: pour f dans * .JPG; do mv "$ f" "` basename $ f .JPG`.jpg "; fait
math
@math: Je préfère ma version car elle fonctionne avec des noms de fichiers contenant des espaces et fonctionnera également avec /path/to/*.JPG. Vous êtes invités à soumettre votre propre réponse, bien sûr :)
Johnsyweb
Bien sûr, le nom de base supprimera les principaux répertoires mais fonctionnera avec les espaces à l'intérieur des noms de fichiers. (Je ne pense pas que cela mérite une réponse;) alors je l'ai posté comme commentaire)
math
10

Si vous pouvez utiliser des outils externes (pas seulement bash), vérifiez la renamecommande!

rename .JPG .jpg *

Le renamefait partie de util-linux.

Uzsolt
la source
renommer est ... problématique. Il existe une version de renommage qui perlaccepte différents arguments pour faire la même chose.
cha0site
Pourriez-vous expliquer un peu plus? Quelle version BTW?
math
3

Si vous avez des espaces dans les noms de fichiers:

for f in *.JPG; do [[ -f "${f}" ]] && mv "${f}" "${f/%JPG/jpg}"; done
cha0site
la source
2

Je suggère de jeter un œil à la mmvcommande. Il convient parfaitement à ce type de tâches. Dans votre scénario, ce serait:

#> mmv "*.JPG" "#1.jpg"

La page de manuel regorge d'exemples, il ne faut donc pas de temps pour s'y habituer.

Sur les systèmes Debian , il peut être installé avec:

#> aptitude install mmv
Alessandro Dotti Contra
la source
0

si vous n'avez pas d'espace dans les noms de fichiers:

for f in *.JPG; do mv $f `echo $f | sed 's/JPG$/jpg/'`; done
Karoly Horvath
la source
1
Il serait assez facile de faire fonctionner cela pour les fichiers avec des espaces dans le nom: ajoutez simplement des guillemets doubles autour des deux arguments mv.
Adam Zalcman
Je n'ai pas d'espace. Que dois-je ajouter pour que cela se produise dans le répertoire CURRENT. Pour le moment, je reçois une erreur - mv: ne peut pas stat `* .JPG ': Aucun fichier ou répertoire
Mark Flint
1
vous n'y avez pas de JPG.
Karoly Horvath