Renommez les fichiers et les répertoires avec find -execdir | rename
Si vous allez renommer à la fois des fichiers et des répertoires non pas simplement avec un suffixe, alors c'est un bon modèle:
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find . -depth -execdir rename 's/findme/replaceme/' '{}' \;
Contrairement à, l' -execdir
option génial fait un cd
dans le répertoire avant d'exécuter la rename
commande -exec
.
-depth
assurez-vous que le changement de nom se produit d'abord sur les enfants, puis sur les parents, pour éviter les problèmes potentiels avec les répertoires parent manquants.
-execdir
est requis car le changement de nom ne fonctionne pas bien avec les chemins d'entrée autres que les noms de base, par exemple ce qui suit échoue:
rename 's/findme/replaceme/g' acc/acc
Le PATH
piratage est nécessaire car il -execdir
a un inconvénient très ennuyeux: il find
est extrêmement avisé et refuse de faire quoi que ce soit avec -execdir
si vous avez des chemins relatifs dans votre PATH
variable d'environnement, par exemple ./node_modules/.bin
, en échouant avec:
find: Le chemin relatif './node_modules/.bin' est inclus dans la variable d'environnement PATH, qui n'est pas sécurisé en combinaison avec l'action -execdir de find. Veuillez supprimer cette entrée de $ PATH
Voir aussi: /ubuntu/621132/why-using-the-execdir-action-is-insecure-for-directory-which-is-in-the-path/1109378#1109378
-execdir
est une extension GNU find pour POSIX . rename
est basé sur Perl et provient du rename
package. Testé dans Ubuntu 18.10.
Renommer la solution de contournement
Si vos chemins d'entrée ne proviennent pas find
, ou si vous en avez assez de la gêne relative du chemin, nous pouvons utiliser une anticipation Perl pour renommer en toute sécurité les répertoires comme dans:
git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'
Je ne l' ai pas trouvé un analogue pratique pour -execdir
avec xargs
: xargs: répertoire de travail modification chemin du fichier avant d' exécuter?
Il sort -r
est nécessaire de s'assurer que les fichiers viennent après leurs répertoires respectifs, car les chemins plus longs viennent après les plus courts avec le même préfixe.
rename
ou Red Hatrename
?