Cambiar el nombre de los archivos con un comando de línea

10

Tengo este directorio y quiero cambiar el nombre de los archivos:

===> ls -1 Der-vierte-Weise/
10 - 10 - Erkenntniss.ogg
1 - 01 - Hoffnung.ogg
11 - 11 - Wahrheit.ogg
12 - 12 - Dankbarkeit.ogg
13 - 13 - Kredits.ogg
2 - 02 - Familie.ogg
3 - 03 - Demut.ogg
4 - 04 - Freude.ogg
5 - 05 - Schoenheit.ogg
6 - 06 - Solidaritaet.ogg
7 - 07 - Entscheidung.ogg
8 - 08 - Hilfe.ogg
9 - 09 - Unterstuetzung.ogg

El resultado debería verse así:

===> ls -1 Der-vierte-Weise/
01 - Hoffnung.ogg
02 - Familie.ogg
...

Me gustaría resolver esto con herramientas comunes de shell.

guettli
fuente
1
Me gustaría resolver esto con herramientas comunes de shell. No digo que no tengas una buena razón, pero confío en que hayas preguntado y respondido una pregunta "¿por qué?". La última vez que tuve un problema muy similar que resolver, inmediatamente empujé a Bash a un lado y lo resolví en Python. Mucho más fácil (pero ya conocía Python, métodos de cadena, glob.glob y os.rename, y también tuve que recurrir a un árbol lleno de nombres de carpetas con espacios y otros caracteres extraños, ninguno de los cuales es una causa de extra molesta si usas Python)
nigel222
1
@ nigel222 Soy flojo y quiero escribir la menor cantidad de caracteres posible. Es por eso que no quiero usar Python aquí. No me malinterpretes. Hasta ahora, Python es mi lenguaje de programación preferido y lo uso a diario.
guettli

Respuestas:

18

Podrías usar rename...

rename -n 's/^[0-9]+ - //' *

Eliminar -ndespués de probar para cambiar el nombre de los archivos

Explicación

  • s/old/new/reemplazar oldconnew
  • ^ inicio de cuerda
  • [0-9]+ algunos numeros
Zanna
fuente
qué tipo de flor regex es compatible con la renameherramienta. ¿Utiliza PCRE? ... sería genial.
guettli
55
@guettli estrictamente hablando, no, no es PCRE (son expresiones regulares compatibles con Perl ). El renamees un script de Perl, por lo que tiene soporte completo de expresión regular de Perl; PCRE es solo un subconjunto de eso. Sin embargo, cualquier cosa que sepa de PCRE será aplicable rename.
terdon el
@terdon No me importa la implementación. Si lo miras con lentes matemáticos, entonces renametiene expresiones regulares compatibles con perl. Sí, la implementación de pcre no se usa. Entendí esto :-) Gracias por su rápida respuesta.
guettli
9

bash expansión de parámetros para quitar la porción requerida desde el inicio:

for f in *[[:blank:]]*.ogg; do echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Forma expandida:

for f in *[[:blank:]]*.ogg; do 
    echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"
done

echoes para correr en seco; deshazte de él para la acción real:

for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Ejemplo:

% ls -1
1 - 01 - Hoffnung.ogg
2 - 02 - Familie.ogg

% for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done 

% ls -1                                                                             
01 - Hoffnung.ogg
02 - Familie.ogg
heemayl
fuente
Si funciona. Gracias. Como conozco la expresión regular compatible con Perl de Python (que uso a diario), prefiero el renamecomando. (Se necesita menos escritura).
guettli
1
@guettli renamees el camino a seguir si está familiarizado con PCRE; la renamerespuesta ya estaba dada, así que hay que moverse con puro bash. Solo para tener en cuenta, pythonel módulo re(o regex) no es totalmente compatible con PCRE BTW.
heemayl
@guettli ¿También rechazaste mi respuesta? : O
heemayl
Sí, lo hice, y voté tu comentario. Espero que no te lo tomes como algo personal. No me malinterpreten, pero mi opinión personal es que esto ${f#[[:digit:]]*-[[:blank:]]}es feo. Si, funciona. Pero vivimos en el siglo XXI. Creo que es hora de cambiar de "funciona" a "es fácil y divertido". Si el objetivo es "funciona", entonces Linux nunca perderá el prejuicio de no ser fácil de usar. Como ya obtuviste muchos votos positivos, este voto negativo no debería doler (espero). Si es así, dígame y lo recuperaré.
guettli
1
@guettli Lo que más te convenga. Aquí: gnu.org/software/bash/manual/html_node/… Solo para tener en cuenta, la clase de personaje [[:digit:]]y si [[:blank:]]estaban allí para cumplir con tu locale, estos también son bastante comunes en Regex.
heemayl