Comment renommer tous les fichiers en minuscules?

123

J'ai par exemple TREE.wav, ONE.WAV. Je veux le renommer en tree.wav, one.wav. Comment renommer tous les fichiers en minuscules?

Voloda2
la source
1
Êtes-vous à l'aise avec une solution Terminal / Shell? Ou voulez-vous que le code C / Objective-C accomplisse cela?
La solution du terminal sera correcte.
Voloda2
3
Je pense que cela devrait être rouvert. le code du terminal est également le code
Danield
1
Cela devrait être une question valide sur stackoverflow. C'est aussi du code.
adev

Réponses:

371

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

  1. Ouvrez Terminal.app, tapez cdpuis faites glisser et déposez le dossier contenant les fichiers à renommer dans la fenêtre.
  2. Pour confirmer que vous êtes dans le bon répertoire, tapez lset 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 lset appuyez à nouveau sur Entrée.

(Merci à @bavarious sur Twitter pour quelques correctifs, et merci à John Whitley ci-dessous pour avoir rendu cela plus sûr sur les systèmes de fichiers insensibles à la casse.)

wjl
la source
9
Faites attention. Si vous avez des fichiers nommés foo.txtet FOO.TXT, cela pourrait écraser l'un d'entre eux.
Keith Thompson
1
Avec bash, vous pouvez simplement faire mv "$f" "${f,,}"declare -l g=$f; mv "$f" "$g"
:,
2
J'ai essayé toutes ces commandes, j'obtiens "mv:" PPP.txt "et" ppp.txt "sont le même fichier" et il ne minuscule mon fichier ... des idées? Est-ce parce que c'est dans le même répertoire?
lorless
1
user2066039: Cela doit être une chose récente sur le Mac, car la plupart des réponses datant de plus d'un an n'en tiennent pas compte. J'ai accompli la tâche en utilisant une extension intermédiaire comme «jpg1». Donc, JPG -> jpg1 -> jpg. J'espère que cela pourra aider.
Joyce
14
Les utilisateurs d'OS X doivent d'abord renommer chaque fichier en un nom temporaire en raison du système de fichiers insensible à la casse, par exemple: for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
John Whitley
10

La question telle que posée est générale, et également importante, je souhaite donc fournir une réponse plus générale:

Cas le plus simple (sûr la plupart du temps, et sur Mac OS X, mais lisez la suite):

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 (n'importe quel système d'exploitation):

IFS=$'\n' ; for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done

Vous devez gérer en toute sécurité les noms de fichiers qui ne diffèrent que par la casse dans un système de fichiers sensible à la casse et ne pas écraser la cible (par exemple Linux):

for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; [ -e "$j" ] && continue ; mv "$i" "$j" ; done 

Remarque sur Mac OS X:

Le système de fichiers de Mac est insensible à la casse, préservant la casse.

Il n'est cependant pas nécessaire de créer des fichiers temporaires, comme suggéré dans la réponse et les commentaires acceptés, car deux noms de fichiers qui ne diffèrent que par cas ne peuvent pas exister en premier lieu, réf .

Pour montrer ceci:

$ 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
Alex Harvey
la source
Oui, mais votre exemple suggère que vous pouvez mettre en minuscules les noms de fichiers en utilisant «mv X x». C'est donc seulement ce que j'ai commenté.
cpaludan
mojave 10.14.5: # touch X x # ls -la total 0 -rw-r - r-- 1 racine racine 0 24 juin 15:19 X # mv X x mv: 'X' et 'x' sont les mêmes file # ls -la -rw-r - r-- 1 root root 0 24 juin 15:19 X
cpaludan
Désolé pour le formatage merdique. SO n'était pas gentil avec moi là-bas.
cpaludan
1
Et mon mauvais - était dans un ssh sur ma framboise sur un lecteur partagé (formaté hfsplus) - là, cela ne fonctionne pas. Mais localement sur mon mac, c'est le cas.
cpaludan
pour i dans *; faire j = $ (tr '[: supérieur:]' '[: inférieur:]' <<< "$ i"); mv "$ i" "$ j"; a travaillé pour moi à Catalina. Merci.
Sinan Eldem
2

Une version coquille de poisson:

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