BandaAncha.eu

Comunidad de usuarios
de fibra, móvil y ADSL

No entiendo el comando Rename

Serakon

Segun lei en teoria si quieres cambiar unos caracteres por otros utilizas

rename 'y/CARACTERaCAMBIAR/CARACTERNUEVO/' *

El caso que al fichero "Cronicas.vampiricas.7x01.m720" le hago:

rename 'y/./ /' *

Y me queda:

"Cronicas vampiricas 7x01 m720 mkv" Bueno bien salvo por que la extensión le quita el punto... digo bueno utilizo:

rename 'y/ mkv/.mkv/' *

Y pienso así me pone ya la parte final la extensión... Y el resultado es... "Cronicas.vampiricas.7x01.m720" que me cambia los espacios por puntos ¿?¿?¿? Y como cambie una parte del texto por otra que no tiene nada que ver lo destroza todo.

Si despues en vez del y uso este:

rename 's/ mkv/\.mkv/' *

Si me lo hace "Cronicas vampiricas 7x01 m720.mkv" pero no entiendo el por que...

BocaDePez
BocaDePez

Sin ser un experto precisamente en la consola de linux, creo que el problema es que el punto "." se utiliza en las opciones del comando, por eso hay que ponerle "\" delante que lo que hace es decirle que ese punto es parte del texto y no una opción. Hay que hacerlo siempre que uses caracteres que son opciones del comando como parte del texto para que no se lie.

🗨️ 3
Serakon

Si eso también probé y cuando ponía la barra pasaba lo mismo... o algo asi....

No se si me paso... que en vez de borrar todos los . borraba uno o me borraba la primera letra del nombre...

🗨️ 2
BocaDePez
BocaDePez

Creo que va con expresiones regulares ...

. es cualquier carácter

\. es un punto

Saludiños

🗨️ 1
BocaDePez
BocaDePez

Una clarificación: en la segunda parte de s/// no es necesario escapar los caracteres, ya que la expresión regular es sólo la primera parte. O sea, s/ mkv/.mkv/ sería correcto.

BocaDePez
BocaDePez
2

Primero usas y/// que es el operador de transliteración. Este operador convierte ambos parámetros en listas de letras y convierte cada una de las letras de la primera lista en la letra correspondiente de la segunda lista. O sea:

" mkv" queda 1) espacio, 2) m, 3) k, 4) v

".mkv" queda 1) ., 2) m, 3) k, 4) v

Por lo que cambia todos los espacios por ., todos los m por m, todos los k por k y todos los v por v. Obtienes el comportamiento esperado.

Luego usas s///, que es el operador de sustitución. Busca todos los " mkv" y los convierte en ".mkv", que es lo que quieres.

Tienes más documentación sobre esos dos operadores en la documentación de Perl.

🗨️ 8
Serakon

Muchas gracias, haré nuevas pruebas a ver que tal.

Alguna forma de indicar que el formato del fichero no lo toque? el ".mkv" o ".XXX" no lo toque?

🗨️ 7
BocaDePez
BocaDePez
1

Fíjate en la primera respuesta:

stackoverflow.com/questions/21825071/ren…he-extension

Aquí hacen justo lo que quieres. He probado lo siguiente y hace justo lo que quieres:

rename 's/\.(?![^.]*$)/ /g' *

O sea, cambia todos los puntos por espacios excepto la extensión.

🗨️ 1
Serakon

Si perfecto, funciona a las maravillas simple y eficaz ojala lo entendiera tan bien aunque parecen expresiones en si... lo mirare con mas calma para comprenderlo.

Mis 6 te dejo xD.

mceds

Muchas. Pero, a mí al menos, no se me ocurre ninguna más sencilla que usar primero el y/// y luego el s///.

Por ejemplo, un "one liner" que funciona es éste:

for MKV in $(find . -name "*mkv"); do mv "$(basename $MKV)" "$(basename $MKV | sed 's_\._ _1;s_\._ _1;s_\._ _1;')"; done

Pero claro, sólo lo hace bien cuando el nombre del archivo tiene tres puntos (además del que separa la extensión). Se podría añadir mierda para que el comando contara previamente el número de puntos "innecesarios" del archivo y modificara en consecuencia el argumento de sed, pero ya nos metemos en unas complicaciones extremas; sobre todo, teniendo en cuenta lo efectivo de la solución que te ha propuesto el otro usuario anónimo.

🗨️ 4
mceds

Pensándolo un poco, no era para tanto. El "one liner" con sed es éste: te sustituye todos los puntos de todos los nombres de archivos del directorio donde te encuentres por espacios, respetando el punto de la extensión:

for FILE in $(find . -type f); do mv "$(basename $FILE)" "$(basename $FILE | sed -e 's_\(.*\)\..*_\1_' -e 's_\._ _g')$(basename $FILE | sed -e 's_.*\(\..*\)_\1_')"; done

Eso sí, la sintaxis de sed es siempre mareante.

🗨️ 3
Serakon
🗨️ 1
mceds
AsmGuy
mceds

Como ya te han dado la respuesta correcta, sólo apuntar que al que distribuye esa serie deberían darle una patada en los huevos por usar puntos para separar palabras.

Y yo te recomendaría, en sistemas UNIX, que no usaras espacios en blancos en los archivos, que siempre están dando por el culo. Mejor "Cronicas_vampiricas_7x01_m720.mkv"