Descubre cómo cambiar nombres de archivos por lotes en Linux de manera rápida y eficiente utilizando diversas herramientas y técnicas en la línea de comandos.
Una de las tareas más comunes para quienes son nuevos en Linux es el cambio de nombres de archivos por lotes. Si no estás acostumbrado a un shell de Linux, esto puede parecer una tarea que necesariamente será manual y tediosa. Pero hay muchas formas de acelerar el proceso; solo necesitas saber cuál es la mejor.
Ejemplo de Tareas de Movimiento de Archivos
Para demostrar cada enfoque, usaré dos ejemplos que representan tareas comunes de cambio de nombre que podrías querer realizar. Existen diferentes maneras en las que podrías querer cambiar los nombres de los archivos, dependiendo de sus nombres actuales y lo que realmente estás haciendo. Las dos tareas de ejemplo que utilizaré pueden ayudar a ilustrar el uso típico de cada herramienta. Sin embargo, necesitarás investigar más sobre la herramienta que elijas para entender cómo usarla mejor para tus necesidades particulares.
Determinar lo que realmente quieres hacer es probablemente la parte más difícil del cambio de nombres de archivos por lotes. Considera qué partes del nombre de cada archivo podrías querer eliminar, cuáles querrías mantener y cuáles querrías traducir a algo diferente.
La primera tarea es cambiar la extensión de todos los archivos coincidentes en el directorio actual. Por ejemplo, cambiar una extensión ".txt" a ".md" debería renombrar test-001.txt a test-001.md, y renombrar ANOTHER.txt a ANOTHER.md. Debe aplicarse a archivos que terminan con ".txt" y no a otros.
La segunda tarea es un poco más complicada, para mostrar algunas características más avanzadas de estas herramientas. Debe eliminar una parte específica de un nombre de archivo, manteniendo todo lo demás intacto. Debe aplicarse a todos los archivos, de forma recursiva. En concreto, buscaré todos los archivos de la forma DDDD_something.ext y los renombraré a DDDD.ext. Así debería cambiar 1234_this-is-my-doc.doc a 1234.doc y docs/9999_about.txt a docs/9999.txt.
1 Con un bucle for, globbing y sustitución de parámetros
Este primer enfoque utiliza varias características del shell bash, que muchos otros shells han tomado prestadas. Primero está el humilde bucle for, que se utilizará para iterar sobre un conjunto de archivos candidatos. En segundo lugar, identifica esos archivos utilizando un glob, un tipo de patrón que está optimizado para coincidir con nombres de archivos. Finalmente, este enfoque utiliza una sintaxis que te permite modificar cadenas basadas en ciertos patrones, llamada sustitución de parámetros.
Para la primera tarea, puedes cambiar las extensiones .txt a .md utilizando este código de shell:
for file in ./*.txt;
do
mv -- "$file" "${file%.txt}.md";
doneEl bucle for itera a través de todos los archivos que coinciden con el glob ./*.txt. Esto coincidirá con todos los archivos en el directorio actual que terminan en la extensión ".txt".
El comando dentro del bucle for mueve el archivo a un nuevo nombre, que genera con el operador %. Este símbolo elimina de una cadena la parte más corta de un patrón que coincide con su final. En este caso, elimina ".txt" del final de cada nombre de archivo y luego agrega ".md" al final.
Todos los ejemplos en este artículo son ilustrativos y no deben ser utilizados de manera ingenua en un entorno de producción. Para una solución robusta, debes considerar si tus archivos pueden contener caracteres especiales, en particular, espacios, y siempre debes tener una política de respaldo para protegerte contra fallos.
La segunda tarea comienza con un patrón glob más complicado para manejar tanto la recursión como un conjunto más amplio de archivos:
for file in ./**/[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_?*.*;
do
mv -- "$file" "${file//_*./.}";
doneEl ./**/ se expande para coincidir con el directorio actual y cualquier directorio anidado, a cualquier nivel por debajo de este. El patrón [[:digit:]] coincide con un solo dígito, por lo que cuatro en fila, seguidos de un guion bajo, coincidirán con nuestros archivos requeridos.
Asegúrate de entender qué shell estás utilizando para ejecutar este comando y qué características de globbing admite.
Para habilitar el globbing recursivo en Bash 4+, asegúrate de ejecutar shopt -s globstar, ya sea como un comando único o dentro de tu script. En Mac, el shell zsh admite globbing recursivo por defecto.
2 Con un bucle for y sed
Otra opción para el comando dentro de tu bucle for es sed, el editor de flujo. El programa sed debería estar disponible en cualquier Linux, incluyendo macOS.
for file in ./*.txt;
do
mv -- "$file" "$(echo "$file" | sed -e 's/txt$/md/')";
doneLa diferencia en esta versión es que el parámetro
La $(...) sintaxis causa que el comando se ejecute y su salida se sustituya en este punto.
La expresión regular pasada a sed reemplaza el valor "txt" al final de cada nombre de archivo con "md". El $ en el patrón asegura que la coincidencia se realice al final de un nombre de archivo.
En la segunda tarea, la expresión regular se vuelve aún más compleja, aunque el enfoque básico permanece igual:
for file in ./**/[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_*.*;
do
mv -- "$file" "$(echo "$file" | sed -E -e 's/([[:digit:]]{4})_.+(\..+)/\1\2/')";
doneNota que la sintaxis de expresiones regulares de sed soporta operadores de repetición como {4}, lo que te permite evitar el enfoque más verboso en el patrón glob.
Aunque estas soluciones de sed son un poco más largas que sus contrapartes de sustitución de parámetros, pueden ser más legibles, especialmente para aquellos que tienen un entendimiento de expresiones regulares y sed. Su soporte para expresiones regulares, junto con varias otras características, significa que sed es una alternativa mucho más poderosa. Para requisitos complejos, esto puede hacer que sea una opción preferida.
3 Uso del comando rename
El comando rename es un script de Perl con soporte para ejecutar código Perl arbitrario, optimizado para manejar el cambio de nombre de archivos. Esto significa que es muy poderoso, aunque necesitarás instalarlo en un sistema con Perl disponible.
Una vez instalado, rename es muy fácil de usar para tareas simples, como el cambio de extensión en nuestro primer ejemplo:
rename 's/\txt$/md/' ./*.txtNota cómo la expresión regular es idéntica a la del ejemplo equivalente de sed. Aquí, sin embargo, el beneficio radica en el manejo de los nombres de archivo por parte de rename. El programa aplicará su sustitución a cada argumento de nombre de archivo, por lo que usar un glob que se expanda a todos los archivos .txt significa que puedes completar la tarea con una sola línea.
El comando rename soporta una opción -n/--dry-run, que imprime un registro de cambios potenciales, sin renombrar realmente los archivos. Esta es una excelente red de seguridad que te recomiendo usar siempre que sea posible.
Tarea 2: rename
También necesitas solo un comando de una línea para la segunda tarea, incluso si la expresión regular es un poco más complicada.
rename 's/(\/\d{4})_.*(\..*)/$1$2/' ./**/*Nota, de nuevo, que esto aprovecha el soporte de glob extendido para directorios recursivos.
4 Uso de zmv con zsh
Si usas zsh, la Z shell, hay otra opción a tu alcance, siempre que la habilites primero. zmv es una función de shell que actúa como una versión simplificada de rename. Necesitarás cargarla, ya sea caso por caso, o mediante un script de inicio como .zshrc, usando este comando:
autoload zmvUna vez habilitada, puedes llamar a zmv así, para llevar a cabo la primera tarea:
zmv -W '*.txt' '*.md'A diferencia de rename, zmv nos lleva de vuelta a globbing en lugar de expresiones regulares, por lo que es un poco menos poderoso. Pero, como puedes ver en este ejemplo, es fácil de usar; la opción -W simplifica aún más la sintaxis más allá de lo predeterminado.
Como es una función de shell, zmv no tiene una página man incorporada. Pero puedes encontrar algo de información sobre ella a través de man zshcontrib. En particular, nota que también soporta una opción -n para realizar una prueba.
Soporte para zms
Dado que zms requiere zsh, se beneficia del globbing extendido que proporciona el shell, incluyendo la recursión en subdirectorios.
zmv '(**/)([0-9][0-9][0-9][0-9])_*(.*)' '$1$2$3'Sin soporte de expresiones regulares, este patrón es un poco más largo, pero aún así muy legible.
5 Uso de mmv
mmv significa "mover múltiples" y es otra herramienta diseñada específicamente para manejar el renombrado masivo de archivos. Probablemente necesitarás instalarlo, pero esto es solo un simple caso de sudo apt install mmv (Ubuntu), sudo yum install mmv (RHEL/CentOS/Fedora), brew install mmv (Mac), o el equivalente en tu gestor de paquetes preferido.
Una vez instalado, puedes usar la herramienta para renombrar extensiones fácilmente:
mmv '*.txt'La gran diferencia con mmv
La gran diferencia con mmv es cómo maneja patrones y coincidencias. Además de los comodines más familiares, mmv también soporta un comodín ; que puedes usar para coincidir con cualquier número de directorios, lo que apoya la naturaleza recursiva de la segunda tarea:
mmv -n ';[0-9][0-9][0-9][0-9]_*.*' '#1#2#3#4#5.#7'Nota también cómo mmv admite referencias a coincidencias, no a través de los típicos paréntesis, sino asignando un número único a cada comodín individual. Esto nos da siete coincidencias diferentes en la expresión de reemplazo final: una para la ruta principal coincidente por ;, una para cada uno de los cuatro dígitos, una—#6—para cualquier carácter después del guion bajo, que descartamos, y una para la extensión que sigue al punto.
Debido a este enfoque, mmv podría ser demasiado engorroso para tareas que impliquen demasiados comodines en el patrón inicial. Pero al llevar a cabo tareas como el intercambio común de extensiones, es difícil de superar en simplicidad y legibilidad.
Si bien hay muchas opciones para el renombrado masivo de archivos en Linux, cada una lleva un tiempo acostumbrarse. Recomiendo elegir una que parezca más accesible y aprenderla lo mejor que puedas, haciendo un uso liberal de la opción -n/--dry-run para aquellas herramientas que la soportan.
Si eres fan de las expresiones regulares, es difícil superar su inmenso poder, y una herramienta como rename probablemente te servirá bien. Si, por otro lado, eres más un gurú de la terminal, un experto con comodines, probablemente te gustará el aspecto de zmv o mmv. Pero esas herramientas solo son buenas si usas el shell Z, o si las instalas y aprendes su sintaxis idiosincrática, respectivamente.
Mientras tanto, la sustitución de parámetros puede ser sorprendentemente poderosa, y es posible que desees repetir tu renombrado masivo de archivos, así que escribir un script de shell tiene beneficios adicionales. En última instancia, la elección es tuya, y cualquiera de estas opciones es preferible a renombrar manualmente cientos de archivos utilizando una GUI. Ese es el poder de la línea de comandos.
Si deseas encontrar artículos similares a Organiza tus archivos de Linux de manera sencilla con estos 5 métodos de cambio de nombre por lotes, te sugerimos revisar la categoría Linux.

Deja una respuesta