Hay prename
, que le permite usar REGEX:
prename 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
Usa la opción -n
para simular:
prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
rename
en muchas distribuciones de Linux, pero no en todas, así que estoy usando el nombre canónico de la utilidad que viene con Perl.
Sugeriría algo como esto:
for i in *-doc-*.txt; do mv "$i" "${i/*-doc-/doc-}"; done
${i/*-doc-/doc-}
reemplaza la primera ocurrencia de *-doc-
con doc-
.
Si necesita hacer más de un reemplazo (vea el comentario número 1), debe usar el ${var//Pattern/Replacement}
variante. Si necesita reemplazar el comienzo del nombre, debe usar ${var/#Pattern/Replacement}
, si necesita reemplazar el final (es decir, la extensión), debe usar el ${var/%Pattern/Replacement}
forma.
Consulte Expansión de parámetros de Shell para obtener más detalles. Esta expansión es específica de bash.
Si tienes rename
entonces, rename 's/^.*-doc-/doc-/' *.txt
debería hacer el truco.
Si desea recurrir a subdirectorios, también hay:
find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv
En el sistema que admita automáticamente expresiones regulares extendidas, puede omitir el -E
.
Ventajas:
- recursos en subdirectorios
- puedes controlar la profundidad máxima de la recursividad
- puede renombrar archivos y/o directorios (-escriba f|d)
Desventajas:
- regexps un poco más complicadas, porque tienes que eliminar la ruta para llegar al nombre del archivo
(respuesta modificada desde aquí)