J'ai par exemple TREE.wav, ONE.WAV. Je veux le renommer en tree.wav, one.wav. Comment puis-je renommer tous les fichiers en minuscules ?
Je reçois -bash: cd: ./*/: Aucun fichier ou dossier de ce type
J'ai par exemple TREE.wav, ONE.WAV. Je veux le renommer en tree.wav, one.wav. Comment puis-je renommer tous les fichiers en minuscules ?
Si vous êtes à l'aise avec le terminal:
Ouvrez Terminal.app, tapez cd
puis faites glisser le dossier contenant les fichiers à renommer dans la fenêtre.
Pour confirmer que vous êtes dans le bon répertoire, tapez ls
et appuyez sur entrée.
Collez ce code et appuyez sur entrée:
for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
Pour confirmer que tous vos fichiers sont en minuscules, tapez ls
et appuyez sur entrée à nouveau.
(Merci à @bavarious sur twitter pour quelques corrections, et merci à John Whitley ci-dessous pour rendre cela plus sûr sur les systèmes de fichiers insensibles à la casse.)
La question telle que posée est générale et aussi importante, donc je souhaite fournir une réponse plus générale :
Cas le plus simple (sûr la plupart du temps, et sur Mac OS X, mais voyez ci-dessous):
for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done
Vous devez également gérer les espaces dans les noms de fichiers (tous les systèmes d'exploitation):
IFS=$'\n' ; for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done
Vous devez gérer de manière sécurisée les noms de fichiers qui diffèrent uniquement par la casse dans un système de fichiers sensible à la casse et ne pas écraser la cible (par exemple sous Linux):
for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; [ -e "$j" ] && continue ; mv "$i" "$j" ; done
Note sur Mac OS X:
Le système de fichiers de Mac est insensible à la casse, tout en préservant la casse.
Cependant, il n'est pas nécessaire de créer des fichiers temporaires, comme suggéré dans la réponse acceptée et les commentaires, car deux noms de fichiers qui ne diffèrent que par la casse ne peuvent pas exister en premier lieu, ref.
Pour le montrer :
$ mkdir test
$ cd test
$ touch X x
$ ls -l
total 0
-rw-r--r-- 1 alexharvey wheel 0 26 Sep 20:20 X
$ mv X x
$ ls -l
total 0
-rw-r--r-- 1 alexharvey wheel 0 26 Sep 20:20 x
Pour ceux qui veulent mettre en minuscules **tous les fichiers dans le répertoire actuel et les sous-répertoires**:
# mettre en minuscules tous les fichiers dans le répertoire actuel et les sous-répertoires
for d in ./**/ ; do (cd "$d" && for x in ./*/ ; do (cd "$x" && for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done); done); done
# lister tous les répertoires
for f in ./**/ ; do echo $f; done
# mettre en minuscules tous les fichiers dans un répertoire
for x in ./*/ ; do (cd "$x" && for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done); done
Une solution simple consiste à utiliser la commande tr
à l'intérieur d'une boucle for.
for file in ./* ; do
mv "$file" "$(tr '[:upper:]' '[:lower:]' <<<"$file")"
done
Vous pouvez en apprendre davantage sur la commande tr
ici Description de la commande tr
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
Êtes-vous à l'aise avec une solution Terminal/shell? Ou souhaitez-vous du code C/Objective-C pour y parvenir?
0 votes
La solution terminale sera ok.
3 votes
Je pense que cela devrait être rouvert. Le code terminal est aussi du code.
1 votes
Cela devrait être une question valide sur stackoverflow. C'est aussi du code.