Il y a prename
, qui vous permet d'utiliser REGEX :
prename 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
Utilisez l'option -n
simuler :
prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
Remarque : Il s'agit de l'expédition sous la forme rename
dans de nombreuses distributions Linux, mais pas dans toutes -- j'utilise donc le nom canonique de l'utilitaire fourni avec Perl.
Je suggérerais quelque chose comme ceci :
for i in *-doc-*.txt; do mv "$i" "${i/*-doc-/doc-}"; done
${i/*-doc-/doc-}
remplace la première occurrence de *-doc-
avec doc-
.
Si vous devez faire plus d'un remplacement (voir commentaire numéro 1), vous devez utiliser le ${var//Pattern/Replacement}
une variante. Si vous devez remplacer le début du nom, vous devez utiliser ${var/#Pattern/Replacement}
, si vous devez remplacer la fin (c'est-à-dire l'extension) vous devez utiliser le ${var/%Pattern/Replacement}
formulaire.
Voir Extension des paramètres du shell pour plus de détails. Cette extension est spécifique à bash.
Si vous avez rename
puis, rename 's/^.*-doc-/doc-/' *.txt
devrait faire l'affaire.
Si vous souhaitez revenir en arrière dans les sous-répertoires, il existe également :
find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv
Sur les systèmes qui prennent automatiquement en charge les expressions régulières étendues, vous pouvez laisser de côté le -E
.
Avantages :
- se récurse dans les sous-répertoires
- vous pouvez contrôler la profondeur maximale de la récursivité
- vous pouvez renommer des fichiers et/ou des répertoires (-type f|d)
Inconvénients :
- expressions régulières légèrement plus compliquées, car vous devez supprimer le chemin pour accéder au nom de fichier
(réponse modifiée à partir d'ici)