135 votes

Comment puis-je renommer tous les fichiers en minuscules ?

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 ?

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.

460voto

wjl Points 2055

Si vous êtes à l'aise avec le terminal:

  1. Ouvrez Terminal.app, tapez cd puis faites glisser le dossier contenant les fichiers à renommer dans la fenêtre.

  2. Pour confirmer que vous êtes dans le bon répertoire, tapez ls et appuyez sur entrée.

  3. 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
  4. 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.)

19voto

Alex Harvey Points 3315

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

5voto

arsenius Points 536

Une version de coquillage de poisson:

pour old in *
    set new (echo $old | tr '[A-Z]' '[a-z]')
    mv $old $new
end

2voto

VeasMKII Points 113

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

0 votes

Je reçois -bash: cd: ./*/: Aucun fichier ou dossier de ce type

0voto

Said Al Souti Points 123

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.com

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.

Powered by:

X