Familiarérrese con la potencia de cambio de nombre de archivos del mundo Linux y brinde mv
—y tú mismo—un descanso. Rename
es flexible, rápido y, a veces, incluso más fácil. Aquí hay un tutorial de esta potencia de un comando.
¿De qué vamos a hablar?
- 1 ¿Qué tiene de malo mv?
- 2 Cambiar el nombre de un solo archivo con mv
- 3 Cambiar el nombre de varios archivos con mv
- 4 ¿Lo que acaba de pasar?
- 5 Tiene que haber una manera más simple
- 6 Hagámoslo de nuevo
- 7 ¿Qué pasó con este momento?
- 8 Cambiar otras partes de un nombre de archivo
- 9 Eliminación de parte de un nombre de archivo
- 10 Limitar los cambios a partes específicas de los nombres de archivo
- 11 Búsqueda con agrupaciones
- 12 Uso de traducciones con cambio de nombre
- 13 Tú (Wo| No aprenda Perl en cinco minutos
¿Qué tiene de malo mv?
No hay nada de malo en mv
. El comando un buen trabajo, y se encuentra en todas las distribuciones de Linux, en macOS y en otros sistemas operativos similares a Unix. Así que siempre está disponible. Pero a veces solo necesitas una excavadora, no una pala.
El mv
tiene un propósito en la vida, y es mover archivos. Es un efecto secundario feliz que se pueda usar para mover un archivo existente en un nuevo archivo, con un nuevo nombre. El efecto neto es cambiar el nombre del archivo, por lo que obtenemos lo que queremos. Pero mv
no es una herramienta dedicada de cambio de nombre de archivos.
Cambiar el nombre de un solo archivo con mv
Utilizar mv
Para cambiar el nombre de un archivo, escriba mv
, un espacio, el nombre del archivo, un espacio y el nuevo nombre que desea que tenga el archivo. A continuación, pulse Intro.
Puedes usar ls
para comprobar que se ha cambiado el nombre del archivo.
mv oldfile.txt newfile.txt
ls *.txt
Cambiar el nombre de varios archivos con mv
Las cosas se complican cuando desea cambiar el nombre de varios archivos. mv
no tiene capacidad para ocuparse de cambiar el nombre de varios archivos. Debes recurrir al uso de algunos ingeniosos trucos de Bash. Eso está bien si conoce algún fu de línea de comandos de grado medio, pero la complejidad de cambiar el nombre de varios archivos con mv
contrasta con la facilidad de uso mv
para cambiar el nombre de un solo archivo.
Las cosas se intensifican rápidamente.
Digamos que tenemos un directorio con una variedad de archivos en él, de diferentes tipos. Algunos de estos archivos tienen una extensión “.prog”. Queremos renombrarlos en la línea de comandos para que tengan una extensión “.prg”.
¿Cómo discutimos? mv
en hacer eso por nosotros? Echemos un vistazo a los archivos.
ls *.prog -l
Aquí hay una forma de hacerlo que no recurre a escribir un archivo de script Bash real.
for f in *.prog; do mv -- "€f" "€{f%.prog}.prg"
¿DId que funcionan? Revisemos los archivos y veamos.
ls *.pr*
Entonces, sí, funcionó. Todos son archivos “.prg” ahora, y no hay archivos “.prog” en el directorio.
¿Lo que acaba de pasar?
¿Qué hizo realmente ese largo comando? Vamos a desglosarlo.
for f in *.prog; do mv -- "€f" "€{f%.prog}.prg"
La primera parte inicia un bucle que va a procesar cada archivo “.prog” en el directorio, a su vez.
La siguiente parte dice lo que el procesamiento hará hacer. Está utilizando mv
para mover cada archivo a un nuevo archivo. El nuevo archivo se nombraré con el nombre del archivo original, excluyendo la parte “.prog”. En su lugar, se utilizará una nueva extensión de “.prg”.
Tiene que haber una manera más simple
Definitivamente. Es el rename
mandar.
rename
no forma parte de una distribución estándar de Linux, por lo que deberá instalarla. También tiene un nombre diferente en diferentes familias de Linux, pero todas funcionan de la misma manera. Solo tendrá que sustituir el nombre de comando apropiado de acuerdo con el sabor de Linux que esté utilizando.
en las distribuciones derivadas de Ubuntu y Debian que instala rename
Así:
sudo apt-get install rename
En las distribuciones derivadas de Fedora y RedHat se instalan prename
Así. Nótese la “p” inicial, que significa Perl.
sudo dnf install prename
Para instalarlo en Manjaro Linux utilice el siguiente comando. Tenga en cuenta que el comando de cambio de nombre se llama perl-rename
.
sudo pacman -Syu perl-rename
Hagámoslo de nuevo
Y esta vez usaremos rename
. Haremos retroceder el reloj para que tengamos un conjunto de archivos “.prog”.
ls *.prog
Ahora usemos el siguiente comando para cambiarles el nombre. A continuación, comprobaremos con ls
si funcionó. Recuerda sustituir rename
con el nombre de comando apropiado para su Linux si no está utilizando Ubuntu o un Linux derivado de Debian.
rename 's/.prog/.prg/' *.prog
ls *.pr*
Eso funcionó, ahora son todos archivos “.prg”, y no quedan archivos “.prog” en el directorio.
¿Qué pasó con este momento?
Vamos a explicar ese pedacito de magia, en tres partes.
El Primero part es el nombre del comando, rename
(o prename
o perl-rename
, para las demás distribuciones).
El último parte es *.prog
, que dice rename
para operar en todos los archivos “.prog”.
El medio parte define el trabajo que queremos que se realice en cada nombre de archivo. El s
significa sustituto. El primer término (.prog
) es lo que rename
buscará en cada nombre de archivo y en el segundo término (.prg
) es con lo que se sustituirá.
La parte media de lae comando, o expresión central, es un Perl ‘expresión regular‘ y es lo que da el rename
comanda su flexibilidad.
Cambiar otras partes de un nombre de archivo
Hemos cambiado las extensiones de nombre de archivo hasta ahora, modifiquemos otras partes de los nombres de archivo.
En el directorio hay muchos archivos de código fuente C. Todos los nombres de archivo tienen el prefijo “slang_”. Podemos comprobarlo con ls
.
ls sl*.c
Vamos a reemplazar todas las ocurrencias de “slang_” por “sl_”. El formato del comando ya nos es familiar. Solo estamos cambiando el término de búsqueda, el término de reemplazo y el tipo de archivo.
rename 's/slang_/sl_' *.c
Esta vez estamos buscando archivos “.c” y buscando “slang_”. Siempre que se encuentra “slang_” en un nombre de archivo, se sustituye por “sl_”.
Podemos comprobar el resultado de ese comando repitiendo el ls
desde arriba con los mismos parámetros:
ls sl*.c
Eliminación de parte de un nombre de archivo
Podemos eliminar una parte de un nombre de archivo sustituyendo el término de búsqueda por nada.
ls *.c
rename 's/sl_//' *.c
ls *.c
Podemos ver desde el ls
ordenar que nuestros archivos “.c” estén todos precedidos de “sl_”. Vamos a deshacernos de eso por completo.
El rename
sigue el mismo formato que antes. Vamos a buscar archivos “.c”. El término de búsqueda es “sl_”, pero no hay un término de sustitución. Dos barras traseras sin nada entre ellas no significan nada, una cuerda vacía.
rename
procesará cada archivo “.c” a su vez. Buscará “sl_” en el nombre del archivo. Si se encuentra, será reemplazado por nada. En otras palabras, se elimina el término de búsqueda.
El segundo uso de la ls
confirma que el prefijo “sl_” se ha eliminado de todos los archivos “.c”.
Limitar los cambios a partes específicas de los nombres de archivo
Usemos ls
para ver los archivos que tienen la cadena “param” en su nombre de archivo. Luego usaremos rename
para reemplazar esa cadena con el “parámetro” de cadena. Usaremos ls
una vez más para ver el efecto el rename
ha tenido en esos archivos.
ls *param*
rename 's/param/parameter' *.c
ls *param*
Se encuentran cuatro archivos que tienen “param” en su nombre de archivo. param.c, param_one.c y param_two.c tienen “param” en el empezar de su nombre. third_param.c tiene “param” en el fin de su nombre, justo antes de la extensión.
El rename
va a buscar “param” en todas partes en el nombre del archivo, y reemplazarlo con “parámetro” en todos los casos.
El segundo uso de la ls
El comando nos muestra que eso es exactamente lo que ha sucedido. Ya sea que “param” estuviera al principio o al final del nombre del archivo, se ha reemplazado por “parámetro”.
Podemos usar los metacaracteres de Perl para refinar el comportamiento de la expresión media. Los metacaracteres son símbolos que representan posiciones o secuencias de caracteres. Por ejemplo ^
significa “inicio de una cadena”, €
significa “fin de una cadena”, y .
significa cualquier carácter individual (aparte de un carácter de nueva línea).
Vamos a usar el inicio del metacaracter de cadena ( ^
) para restringir nuestra búsqueda al inicio de los nombres de archivo.
ls *param*.c
rename 's/^parameter/value/' *.c
ls *param*.c
ls value*.c
Los archivos que renombramos anteriormente se enumeran, y podemos ver que la cadena “parámetro” está al principio de tres nombres de archivo y está al final de uno de los nombres de archivo.
Nuestro rename
Utiliza el inicio de línea (^
) metacaracter antes del término de búsqueda “parámetro”. Esto indica rename
para considerar que solo se ha encontrado el término de búsqueda si está al principio del nombre del archivo. El “parámetro” de la cadena de búsqueda se ignorará si se encuentra en cualquier otro lugar del nombre del archivo.
Consultar con ls
, podemos ver que el nombre de archivo que tenía “parámetro” en el fin del nombre de archivo no se ha modificado, pero los tres nombres de archivo que tenían “parámetro” en el empezar de sus nombres han sido reemplazados por el término sustituto “valor”.
El poder de rename
radica en el poder de Perl. Todos los poder de Perl está a su disposición.
Búsqueda con agrupaciones
rename
tiene aún más trucos bajo la manga. Consideremos el caso en el que puede tener archivos con cadenas similares en sus nombres. No son exactamente las mismas cadenas, por lo que una simple búsqueda y sustitución no funcionará aquí.
En este ejemplo usamos ls
para comprobar qué archivos tenemos que empiezan por “str”. Hay dos de ellos, cuerda.c y estrangulamiento.c. Podemos renombrar ambas cadenas a la vez usando una técnica llamada agrupación.
La expresión central de esto rename
Buscará cadenas dentro de los nombres de archivo que tengan la secuencia de caracteres “STRI” o “stra” donde esas secuencias son seguidas inmediatamente por “ng”. En otras palabras, nuestro término de búsqueda va a buscar “cadena” y “estrangulado”. El término de sustitución es “bang”.
ls str*.c
rename 's/(stri|stra)ng/bang/' *.c
ls ban*.c
Usando ls
una segunda vez confirma que la cuerda.c se ha convertido en bang.c y strangle.c ahora es bangle.c.
Uso de traducciones con cambio de nombre
El rename
puede realizar acciones en nombres de archivo denominados traducciones. Un ejemplo simple de una traducción sería forzar un conjunto de nombres de archivo en mayúsculas.
En rename
A continuación, observe que no estamos utilizando un comando s/
Para iniciar la expresión central, estamos usando y/
. Esto indica rename
no estamos realizando una sustitución; estamos realizando una traducción.
El a-z
term es una expresión de Perl que significa todos los caracteres en minúsculas de la secuencia de la a a la z. Del mismo modo, el A-Z
term representa todas las letras mayúsculas de la secuencia de la A a la Z.
La expresión central de este comando podría parafrasearse como “si alguna de las letras minúsculas de la a a la z se encuentra en el nombre del archivo, reemplácelas con los caracteres correspondientes de la secuencia de caracteres en mayúsculas de la A a la Z”.
Para forzar los nombres de archivo de todos los archivos “.prg” a mayúsculas, utilice este comando:
Cambie el nombre ‘y/a-z/A-Z/’ *.prg
ls *.PRG
El ls
nos muestra que todos los nombres de archivo “.prg” están ahora en mayúsculas. De hecho, para ser estrictamente precisos, ya no son archivos “.prg”. Son “. PRG” archivos. Linux no se puede hacer casos.
Podemos invertir ese último comando invirtiendo la posición del a-z
y A-Z
términos en la expresión central.
renombrar ‘y/A-Z/a-z/’ *. PRG
ls *.prg
Tú (Wo| No aprenda Perl en cinco minutos
Familiarizarse con Perl es un tiempo bien empleado. Pero para comenzar a usar las capacidades de ahorro de tiempo de la rename
No necesita tener mucho conocimiento de Perl para cosechar grandes beneficios en potencia, simplicidad y tiempo.