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)