He decidido empezar a utilizar este blog también para compartir con todo aquél a quien le interese esos truquillos de GNU/Linux que utilizo y que no son tan sencillos de encontrar por ahí. En este artículo vamos a abordar un problema que a mí en el trabajo se me plantea constantemente: el de renombrar un porrón de archivos a la vez conforme a un cierto patrón. Esto que voy a explicar vale tanto para fotografías, como para archivos de texto como para cualquier otro tipo de documento.
Supongamos que tenemos una serie de documentos metidos en una carpeta, pero no queremos renombrarlos todos, sino sólo aquellos cuyo nombre comienza por FTransform (es decir, se trata de aquellos archivos cuyo nombre corresponde a las cadenas FTransform* . Si no te suena lo que pueda ser ese asterisco, te recomiendo que mires por ejemplo aquí lo que son los metacaracteres de la shell de Linux). Lo que queremos es convertirlos en una secuencia de archivos de la forma FourierTransform.Número, donde Número va a ser un entero de 7 dígitos empezando en el 0000001. Si hubiese 758 archivos de la forma FTransform* al final lo que obtendremos será una secuencia de archivos de la forma FourierTransform.0000001 a FourierTransform.0000758
Para hacer esto tendríamos que ingresar la siguiente línea de comando:
$ ls FTransform* | nl -nrz -w7 | while read a b; do mv "$b" FourierCoefs.$a ; done
Vamos a entender un poco qué hace este comando. Las barras verticales son entubamientos (pipes). Si no te suenan puedes mirar qué son en el mismo enlace de antes. El comando ls muestra todos los archivos que se correspondan con la cadena FTransform*, nl cuenta el número de líneas de la salida del comando anterior, y la opción -w7 hace que muestre el resultado en forma de entero de 7 dígitos. Por último, el bucle while do itera tantas veces como archivos haya encontrado, renombrando en cada uno de los pasos un archivo con un número diferente al anterior, sumando uno en cada ciclo.
Supongamos ahora que, en la secuencia anterior, por algún motivo no deseamos que la serie empiece en 1, sino en un valor superior. Digamos que queremos que el primer valor sea, en lugar de el 000001,
el 1000001. Podríamos entonces hacer lo siguiente:
rename -v 's/FourierCoefs.(\d{7})/FourierCoefs.1$1/' FourierCoefs.*
El comando rename, que como su nombre ya sugiere sirve para renombrar archivos, utiliza expresiones regulares de Perl, que tienen una sintaxis muy particular y no voy a entrar en ello; en Internet hay suficiente información. Me limitaré a explicar por encima qué hace la línea de consola anterior: la opción -v hace que se muestre por pantalla el nombre del archivo modificado, lo que está entre comillas (' ') es la expresión regular, y el último término de la derecha es el nombre del archivo que queremos renombrar, en este caso, todos los archivos que comiencen por FourierCoefs. .
La expresión regular está formada por tres trozos separados por barras diagonales ( / ). El primero es simplemente una letra s, que indica que lo que vamos a hacer es sustituir el segundo bloque por el tercero. El segundo es el nombre original del archivo, en este caso FourierCoefs. seguido de una cadena de 7 caracteres que almacenaremos en memoria (\d{7}). El tercer bloque es el nuevo nombre del archivo, que quedará como FourierCoefs.1 seguido de la cadena que almacenamos en el bloque 2, y a la que hacemos referencia con la variable $1.
Para más información acerca de los comandos empleados, os recomiendo consultar el manual, y desde luego, preguntarle a Google.
Espero que esta información le resulte útil a alguien más :)
Adenda:
Por si a alguien le preocupa que los archivos aparezcan sin extensión, añado este párrafo. Si quisiésemos que en lugar de de la forma FourierTransform.0067201 los archivos de salida nos quedasen por ejemplo de esta otra manera, FourierTransform.67201.txt, lo único que tendríamos que hacer sería cambiar -w7 por -w5 y Fouriercoefs.$a por Fouriercoefs.$a.txt en la primera línea, quedando entonces
$ ls FTransform* | nl -nrz -w5 | while read a b; do mv "$b" FourierCoefs.$a.txt ; done
Las modificaciones para el segundo comando son igualmente sencillas.
Mil gracias. Intentando interpretar el comando con tu ayuda, conseguí recodificar un montón de archivos grabados con el teléfono.
ResponderEliminarEl nombre quedo medio feo, nombreoriginal.arm.ogg; pero los puedo usar, que no es poco.
Mi comando
ls *.amr | nl -nrz -w3 | while read a b; do ffmpeg -i "$b" $b.ogg ; done
Excelente !!!!!!!!!!!
ResponderEliminarBusque por muchas horas y el metodo del ls con nl y while era lo que buscaba !!!!
Sos un maestro
Salduso
Excelente información
ResponderEliminarMuchas gracias a los tres, me alegro de que os haya sido útil.
ResponderEliminar