C'è prename , che ti consente di utilizzare REGEX:
prename 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
Usa l'opzione -n simulare:
prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
Nota: Questo viene spedito come rename in molte distribuzioni Linux, ma non in tutte, quindi sto usando il nome canonico per l'utilità fornita con Perl.
Suggerirei qualcosa del genere:
for i in *-doc-*.txt; do mv "$i" "${i/*-doc-/doc-}"; done
${i/*-doc-/doc-} sostituisce la prima occorrenza di *-doc- con doc- .
Se hai bisogno di fare più di una sostituzione (vedi commento numero 1), devi usare il ${var//Pattern/Replacement} variante. Se devi sostituire l'inizio del nome devi usare ${var/#Pattern/Replacement} , se devi sostituire la fine (es:l'estensione) devi usare ${var/%Pattern/Replacement} modulo.
Vedere Espansione dei parametri della shell per ulteriori dettagli. Questa espansione è specifica per bash.
Se hai rename quindi, rename 's/^.*-doc-/doc-/' *.txt dovrebbe funzionare.
Se vuoi ricorrere alle sottodirectory, c'è anche:
find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv
Sui sistemi che supportano automaticamente Regexp estese, puoi tralasciare -E .
Vantaggi:
- ricorre in sottodirectory
- puoi controllare la profondità massima della ricorsione
- puoi rinominare file e/o directory (-type f|d)
Svantaggi:
- regexp leggermente più complicate, perché devi eliminare il percorso per ottenere il nome del file
(risposta modificata da qui)