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)