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. rename
n'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 ./FOO
suivi de ./FOO/BAR
, renommer ./FOO
en ./foo
continuera à être répertorié ./FOO/BAR
mê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/bar
avant ./foo
), mais seulement pour les fichiers qui contiennent un caractère majuscule. Le -name
filtre s'applique uniquement au nom du fichier de base, pas au chemin complet. Donc, cela listera ./FOO/BAR
mais 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 -depth
est 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 find
et les formate dans une mv
commande à l'aide d'une expression régulière. L' -n
option arrête sed
d'imprimer l'entrée et la p
commande 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 find
sorties ./FOO/BAR
, il deviendra mv -n -v -T ./FOO/BAR ./FOO/bar
. L' -n
option de mv
garantit que les fichiers minuscules existants ne sont pas écrasés. L' -v
option rend mv
sortie chaque changement qu'elle fait (ou ne fait pas - si elle ./FOO/bar
existe déjà, elle produit quelque chose comme ./FOO/BAR -> ./FOO/BAR
, en notant qu'aucun changement n'a été effectué). Le -T
est très important ici - il traite le fichier cible comme un répertoire. Cela garantira que ce répertoire ./FOO/BAR
n'est pas déplacé ./FOO/bar
si ce répertoire existe.
Utilisez-le avec find
pour 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 mv
commandes générées vers l'interpréteur shell. Vous pouvez le remplacer par bash
ou n'importe quelle coque de votre choix.
ABCdef
,abcDEF
etaBcDeF
? 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