Je voudrais renommer récursivement tous les fichiers et dossiers (sous-dossiers) en majuscules.
J'ai trouvé des scripts qui le feront en minuscules, mais je ne sais pas comment les changer, donc il le fera dans l'autre sens (de bas en haut).
Le script que j'ai trouvé et fonctionne en minuscule, mais je ne savais pas comment le modifier est:
rename 'y/A-Z/a-z/' *
Ça vient de man rename
.
rename 'y/a-z/A-Z/' *
vous obtiendrez ce que vous voulez. Faites attention où vous le testez.Réponses:
Notez que vous utilisez le script Perl appelé
rename
distribué par Debian et ses dérivés (Ubuntu, Mint,…). D'autres distributions Linux embarquent une commande complètement différente et considérablement moins utile appeléerename
.y/A-Z/a-z/
se traduit chaque caractère dans la plage àA
traversZ
dans le caractère correspondant dans la plage àa
traversz
, soit des lettres majuscules ASCII à la lettre minuscule correspondante. Pour effectuer la traduction opposée, utilisezy/a-z/A-Z/
. Une autre façon d'écrire la même commande estrename '$_ = uc($_)' *
-uc
est la fonction u pper c ase, et larename
commande renomme les fichiers en fonction de la transformation effectuée dans la$_
variable.rename '…' *
ne renomme que les fichiers du répertoire courant, car c'est ce qui*
correspond. Les fichiers de points (les fichiers dont le nom commence par.
) sont également ignorés.Si vous souhaitez renommer les fichiers du répertoire en cours et des sous-répertoires de manière récursive, vous pouvez utiliser la
find
commande pour parcourir le répertoire en cours de manière récursive. Il y a une difficulté ici: si vous appelezrename
, cela renomme à la fois le répertoire et la partie nom de base. Si vous appelezrename
un répertoire avant de rentrer dans it (find -exec rename … {} \;
), celafind
devient confus car il a trouvé un répertoire mais ce répertoire n'existe plus au moment où il essaie d'y descendre. Vous pouvez contourner ce en disantfind
à traverser un répertoire avant d' agir là - dessus, mais vous finissez par tenter de renommerfoo/bar
pour ,FOO/BAR
mais le répertoireFOO
n'existe pas.Un moyen simple d'éviter cette difficulté est de faire en sorte que la commande de changement de nom n'agisse que sur la partie du nom de base du chemin. L'expression régulière
([^/]*\Z)
correspond à la dernière partie du chemin d'accès qui ne contient pas de/
.Le shell zsh offre des fonctionnalités plus pratiques pour renommer - encore plus cryptique que Perl, mais plus tordu et souvent plus facile à composer.
La fonction
zmv
renomme les fichiers en fonction des modèles. Exécutezautoload -U zmv
une fois pour l'activer (mettez cette ligne dans votre.zshrc
).Dans le premier argument de
zmv
(le modèle à remplacer), vous pouvez utiliser les puissants modèles génériques de zsh . Dans le deuxième argument dezmv
(le texte de remplacement), vous pouvez utiliser ses fonctions d' extension de paramètres , y compris les modificateurs d'historique .Explication:
-w
- attribuer automatiquement des variables numériques à chaque motif générique**/*
- tous les fichiers dans les sous-répertoires, récursivement (**/
correspond à 0, 1 ou plusieurs niveaux de sous-répertoires)$1
- la première variable numérique, correspondant ici à la partie répertoire de chaque chemin$2:u
- la deuxième variable numérique, correspondant ici à la partie du nom de base de chaque chemin, avec le:u
modificateur pour convertir la valeur en majusculeEn prime, cela respecte les paramètres de l'environnement local.
Si vous n'êtes pas sûr d'une
zmv
commande que vous avez écrite, vous pouvez passer l'-n
option pour imprimer ce que la commande ferait et ne rien changer. Vérifiez la sortie et, si elle fait ce que vous voulez, réexécutez la commande sans-n
réellement agir.la source
Volé (avec une modification mineure) de Gilles post ici
find <DIR> -depth -type d -exec rename -n 's!/([^/]*/?)$!\U/$1!' {} +
la source
find <dir> -exec rename 'y/a-z/A-Z/' {} \;
find
renommez des répertoires tout en y récursif.find <dir> -depth -exec rename 'y/a-z/A-Z/' {} \;
faut donc gérer le problème de renommage des répertoires. Correct?rename
changements , par exemplefoo/bar
àFOO/BAR
etFOO
n'existe pas à ce moment - là.Je voudrais diriger toute personne qui est toujours liée à cette réponse à l'excellente réponse que Guiles Quernot a donnée à cette question qui ne nécessite pas
find
.La commande résultante serait:
Mais avant d'exécuter, veuillez lire la réponse liée pour les mises en garde concernant les anciennes versions de bash.
Enfin, au cas où quelqu'un se demanderait ce que fait la
y///
commandeperl regex
. Voici un lien vers la documentation pertinente .la source
find -execdir
| RenommerCe serait le meilleur moyen de le faire sans la folie relative du chemin, car cela évite que Perl regex fu n'agisse que sur le nom de base:
-execdir
d'abordcd
dans le répertoire avant d'exécuter uniquement sur le nom de base.Malheureusement, je ne peux pas me débarrasser de cette
PATH
partie de piratage,find -execdir
refuse de faire quoi que ce soit si vous avez un chemin relatif dansPATH
...: /ubuntu/621132/why-using-the-execdir-action- is-insecure-for-directory-which-is-in-the-path / 1109378 # 1109378la source
Essayez ceci après avoir déplacé vers le répertoire où vous souhaitez renommer les fichiers:
la source
ls -l
uniquement pour couper les colonnes autres que le nom?), Et utilisez des guillemets doubles autour des substitutions de variables . Votre code est trop complexe et se casse sur les noms de fichiers contenant des espaces et d'autres caractères spéciaux. Utilisezfind
ou**/
pour rentrer dans des sous-répertoires, la sortie dels
est uniquement destinée à la consommation humaine.