Ê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:
Ouvrez Terminal.app, tapez cdpuis faites glisser et déposez le dossier contenant les fichiers à renommer dans la fenêtre.
Pour confirmer que vous êtes dans le bon répertoire, tapez lset 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 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.)
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
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
Réponses:
Si vous êtes à l'aise avec le terminal:
cd
puis faites glisser et déposez le dossier contenant les fichiers à renommer dans la fenêtre.ls
et appuyez sur Entrée.Collez ce code et appuyez sur Entrée:
ls
et 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.)
la source
foo.txt
etFOO.TXT
, cela pourrait écraser l'un d'entre eux.mv "$f" "${f,,}"
declare -l g=$f; mv "$f" "$g"
for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
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):
Vous devez également gérer les espaces dans les noms de fichiers (n'importe quel système d'exploitation):
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):
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:
la source
Une version coquille de poisson:
la source