find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh
Je n'ai pas essayé les scripts plus élaborés mentionnés ici, mais aucune des versions de ligne de commande n'a fonctionné pour moi sur mon Synology NAS. renamen'est pas disponible, et de nombreuses variantes findéchouent car il semble s'en tenir à l'ancien nom du chemin déjà renommé (par exemple, s'il trouve ./FOOsuivi de ./FOO/BAR, renommer ./FOOen ./foocontinuera à être répertorié ./FOO/BARmême si ce chemin n'est plus valide) . La commande ci-dessus a fonctionné pour moi sans aucun problème.
Ce qui suit est une explication de chaque partie de la commande:
find . -depth -name '*[A-Z]*'
Cela trouvera n'importe quel fichier du répertoire courant (changez .pour le répertoire que vous voulez traiter), en utilisant une recherche en profondeur d'abord (par exemple, il listera ./foo/baravant ./foo), mais seulement pour les fichiers qui contiennent un caractère majuscule. Le -namefiltre s'applique uniquement au nom du fichier de base, pas au chemin complet. Donc, cela listera ./FOO/BARmais pas ./FOO/bar. C'est correct, car nous ne voulons pas renommer ./FOO/bar. Nous voulons cependant renommer ./FOO, mais celui-ci est répertorié plus tard (c'est pourquoi il -depthest important).
Cette commande en elle-même est particulièrement utile pour trouver les fichiers que vous souhaitez renommer en premier lieu. Utilisez-le après la commande de changement de nom complète pour rechercher des fichiers qui n'ont toujours pas été remplacés en raison de collisions de noms de fichiers ou d'erreurs.
sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'
Cette partie lit les fichiers produits par findet les formate dans une mvcommande à l'aide d'une expression régulière. L' -noption arrête sedd'imprimer l'entrée et la pcommande de l'expression régulière de recherche et de remplacement génère le texte remplacé.
Le regex lui-même se compose de deux captures: la partie jusqu'au dernier / (qui est le répertoire du fichier), et le nom du fichier lui-même. Le répertoire est laissé intact, mais le nom de fichier est transformé en minuscules. Donc, si les findsorties ./FOO/BAR, il deviendra mv -n -v -T ./FOO/BAR ./FOO/bar. L' -noption de mvgarantit que les fichiers minuscules existants ne sont pas écrasés. L' -voption rend mvsortie chaque changement qu'elle fait (ou ne fait pas - si elle ./FOO/barexiste déjà, elle produit quelque chose comme ./FOO/BAR -> ./FOO/BAR, en notant qu'aucun changement n'a été effectué). Le -Test très important ici - il traite le fichier cible comme un répertoire. Cela garantira que ce répertoire ./FOO/BARn'est pas déplacé ./FOO/barsi ce répertoire existe.
Utilisez-le avec findpour générer une liste de commandes qui seront exécutées (pratique pour vérifier ce qui sera fait sans le faire réellement)
sh
C'est assez explicite. Il achemine toutes les mvcommandes générées vers l'interpréteur shell. Vous pouvez le remplacer par bashou n'importe quelle coque de votre choix.
ABCdef,abcDEFetaBcDeF? Le script de changement de nom doit-il abandonner ou simplement avertir et continuer? 2. Comment définissez-vous des minuscules pour les noms non US-ASCII? Si de tels noms peuvent être présents, doit-on d'abord vérifier et exclure le passage? 3. Si vous exécutez une opération de changement de nom