Tengo cientos de carpetas con miles de subdirectorios y archivos dentro de ellas. Los nombres de los archivos están actualmente en el formato
sf{number}-{number} - {text}
y necesito que todo se borre hasta {texto}.
Ejemplo:
sf012-05 - toto - africa.cdg
sf012-05 - toto - africa.mp3
->
toto - africa.cdg
toto - africa.mp3
Formatos adicionales:
SF-108 - 02 Johnny Hates Jazz Shattered Dreams[K].cdg
02 - David Essex - Rock On.cdg
SF0504 - 13 Walker Brothers, The Make It Easy On Yourself.cdg
SFLY 051 - 07 America A Horse With No Name.cdg
SF217-12 this love - maroon 5.cdg
SF262-13. Same Mistake - James Blunt.cdg
SF287 - 13 Luke Bryan Do I.cdg
SF355-01-15 - Tough Love - Pony.cdg
Track 11 Livin' La Vida Loca (Radio Edit) - Martin, Ricky.cdg
Sunfly Hits 275 - 07 SF275-7-Right Now (Na Na Na)-Akon.mp3
Second, Minute Or Hour - Jack Penate.mp3
SF057 - Karaoke Classics Vol.57 - 03 Abba Thank You For The Music.cdg
Especialmente el último es una completa mierda.
Eso significa que necesito un script bash de expresiones regulares recursivo o algo similar para revisar estos archivos y cambiarles el nombre.
Respuesta1
Si tiene la rename
utilidad basada en Perl (llamada prename
en algunas distribuciones), puede usar una expresión regular para cambiar el nombre de todos los archivos de una sola vez.
Su requisito solicita la eliminación, sf{number}-{number}
pero todos los ejemplos comienzan con mayúsculas, algunos de ellos contienen solo una {number}
, {number}-{number}-{number}
o incluso {number}{space}-{space}{number}
. Voy a suponer que desea incluir los dos primeros de estos casos.
rename -n 's/^sf[0-9-]+\s+(-\s+)?//' [Ss][Ff]*
Elimine el -n
cuando esté listo para que aplique sus cambios o cámbielo para -v
verlo procesar los archivos a medida que avanza.
Respuesta2
La herramienta más sencilla aquí seríazsh(como bash, sólo que mejor), con suglobo de fantasíay elzmv
función. Ejecute esto desde el directorio de nivel superior donde desea cambiar el nombre de los archivos.
autoload -U zmv
zmv '(**/)[Ss][Ff][0-9]##-[0-9]##[- ]#(*)' '$1$2'
Explicación: **/
es cualquier cadena de directorios principales. Luego hay un patrón de sf
(no distingue entre mayúsculas y minúsculas) seguido de uno o más dígitos, un guión y otro número, seguido de guiones y espacios. Finalmente puede haber cualquier sufijo *
. Los números en el reemplazo se refieren a los grupos entre paréntesis en el patrón.
Alternativamente, puede usar prename
(es posible que sea necesario instalar por separado el script de cambio de nombre basado en Perl, disponible en Debian y Arch Linux, en otras distribuciones). Deberá combinarlo para find
recopilar la lista de archivos a los que cambiarles el nombre. No importa si rename
se pasan archivos que no coinciden, omitirá los archivos a los que no es necesario cambiarles el nombre.
find -name '[Ss][Ff]*' -exec prename 's!/!sf[0-9]+-[0-9]+[- ]*!!i' {} +
Respuesta3
Aquí está el código (reemplace directorio por el directorio principal, o donde tenga los subdirectorios):
cd directory
find -type f | while IFS= read - file; do
name=$(echo "$file" | rev | cut -d'/' -f1 | rev | cut -d'-' -f3- | cut -d' ' -f2-)
path=$(dirname "$file")
newname="${path}/${name}"
echo mv "$file" "$newname"
done
Donde directorio es el directorio principal donde están todos los subdirectorios....
No elimine el "eco" de "mv", pruébelo primero.
Tenga cuidado de no ejecutarlo en el directorio incorrecto, puede ser muy peligroso.
Respuesta4
tu dices tunecesito borrar todo hasta {texto}, pero tu ejemplo no muestra eso. En lugar de mostrar el código exacto, permítanme sugerir un plan.
1) Escribe un guión que haga lo que quieresunoNombre del archivo. Algo como esto podría funcionar:
#! /bin/sh
test -d ~/OK/${PWD} || mkdir -p ~/OK/${PWD}
ln "$1" "~/OK/${PWD}/$1"
echo "$1" | awk -F ' - ' '{print $NF}'
Eso divide el nombre en el patrón '-' e imprime el último campo. Y guarda el nombre del archivo original para que puedas recuperarlo si algo sale mal. Pruébelo varias veces y utilícelo mv
para restaurar los nombres.
2) Invoca tu script conencontrar:
$ find dirname -exec script.awk {} +
Eso enterrará su máquina con muchas invocaciones paralelas de su script. Cuando termine, tendrá un montón de directorios correctos para eliminar y sabrá cómo utilizar buscar para eliminarlos.