LinuxParty
Si desea cambiar rápidamente el nombre de varios archivos en un directorio, deberá utilizar (puede hacerlo en un script) la sentencia for
en ub bucle (a veces en combinación con otras utilidades como sed
o tr
)
Los ejemplos de este artículo incluyen la eliminación de los espacios de nombres de archivo, añadir y eliminar sufijos y prefijos, y cambiar de mayúsculas a minúsculas.
Aquí está una lista completa de los ejemplos que voy a tener en cuenta:
- Eliminar los espacios de nombres de archivo
- Alternativa para quitar los espacios de nombres de archivo
- Añadir un sufijo
- Añadir un prefijo
- Eliminar un prefijo
- Eliminar un sufijo
- De mayúsculas a minúsculas
- De mayúsculas a minúsculas (sólo sufijo)
- Una situación poco probable
Quitar los espacios de nombres de archivo
Tengo algunos archivos mp3 imaginarios con espacios en los nombres de archivo. Los espacios en los nombres de archivo son una mala idea. Es un inconveniente, los espacios son delimitadores entre los argumentos de la línea de comandos y los archivos que usted está poniendo a cabo a través de Internet, pueden causar otros problemas, así que vamos a deshacernos de estos espacios como una cuestión de principios. (¿Quien tubo las estúpida idea de poner espacios en los nombres de archivo?)
$ ls -l
total 468 -rw-r--r-- 1 rob rob 15015 2006-10-20 11:18 01 - Some Song.mp3 -rw-r--r-- 1 rob rob 17313 2006-10-20 11:18 02 - Another Song.mp3 -rw-r--r-- 1 rob rob 17381 2006-10-20 11:19 03 - Yet Another Song.mp3 -rw-r--r-- 1 rob rob 410075 2006-10-20 11:19 04 - A New Song.mp3 -rw-r--r-- 1 rob rob 7327 2006-10-20 11:19 05 - Some Instrumental Piece.mp3
Voy a cambiar los espacios por subrayado. Como yo no quiero echar a perder las cosas, voy a ser cauteloso, para empezar:
$ for FILE in *.mp3 ; do NEWFILE=`echo $FILE | sed 's/ /_/g'` ; echo "$FILE will be renamed as $NEWFILE" ; done
01 - Some Song.mp3 will be renamed as 01_-_Some_Song.mp3 02 - Another Song.mp3 will be renamed as 02_-_Another_Song.mp3 03 - Yet Another Song.mp3 will be renamed as 03_-_Yet_Another_Song.mp3 04 - A New Song.mp3 will be renamed as 04_-_A_New_Song.mp3 05 - Some Instrumental Piece.mp3 will be renamed as 05_-_Some_Instrumental_Piece.mp3
Esto se ve bien, así que voy a intentarlo de verdad.
$ for FILE in *.mp3 ; do NEWFILE=`echo $FILE | sed 's/ /_/g'` ; mv "$FILE" $NEWFILE ; done
$ ls -l
total 468 -rw-r--r-- 1 rob rob 15015 2006-10-20 11:18 01_-_Some_Song.mp3 -rw-r--r-- 1 rob rob 17313 2006-10-20 11:18 02_-_Another_Song.mp3 -rw-r--r-- 1 rob rob 17381 2006-10-20 11:19 03_-_Yet_Another_Song.mp3 -rw-r--r-- 1 rob rob 410075 2006-10-20 11:19 04_-_A_New_Song.mp3 -rw-r--r-- 1 rob rob 7327 2006-10-20 11:19 05_-_Some_Instrumental_Piece.mp3
Me doy cuenta de que hay una forma alternativa, utilizando tr
, que es más fácil (para escribir ). Sin embargo, yo diría que el principio la técnica anterior (usando sed
) se puede aplicar a más situaciones, por lo que es más útil como una plantilla.
Para aquellos que no están familiarizados con la línea de comandos, voy a descomponerlo en sus componentes constitutivos. Si está familiarizado con este tipo de cosas, no dude en pasar a los otros ejemplos .
Este no es el lugar para hablar for
en gran detalle. Hay un montón de recursos en Internet para ese tipo de cosas. Cuando yo estaba empezando a aprender estas cosas, siempre me pareció un análisis detallado de estas cosas confusas, y que la mejor manera de aprender es hacerlo en realidad.
for FILE in *.mp3
En esta parte del bucle, FILE
es la variable y *.mp3
es el argumento. El bucle for
genera una variable para cada argumento hasta que no quedan argumentos. En el ejemplo anterior, las variables generadas son todos los archivos que coincidan con la expresión regular *.mp3
, en otras palabras:
01 - Algunos Song.mp3 02 - Otra Song.mp3 03 - Sin embargo, otro Song.mp3 04 - Un Nuevo Song.mp3 05 - Algunos Piece.mp3 Instrumental
; do
El punto y coma es un carácter especial que le permite terminar un comando y ejecutar otro comando en la misma línea. Todo for
requiere un do
.
NEWFILE=`echo $FILE | sed 's/ /_/g'`
Ahora estoy creando una nueva variable llamada NEWFILE
. sed
se utiliza para reemplazar cada espacio en el nombre del archivo mp3 referenciado en FILE
con un guión (s/ /_/g
), por lo que la variable NEWFILE
es lo mismo que FILE
, excepto el valor de cada variable de cada espacio ha sido sustituido por un guión bajo.
La siguiente parte es el comando que queremos ejecutar en cada argumento:
mv "$FILE" $NEWFILE
Renombra el contenido del valor de la variable $FILE a $NEWFILE, al estar dentro del lazo (do...done) se renombrará cada valor de la primera variable en el valor de la segunda variable hasta que se quede sin argumentos.
; done
Por último, todos los do
requiere un done
.
Estos son algunos otros ejemplos.
Alternativa para quitar los espacios de nombres de archivo
$ ls -l
total 468 -rw-r--r-- 1 rob rob 15015 2006-10-20 11:18 01 - Some Song.mp3 -rw-r--r-- 1 rob rob 17313 2006-10-20 11:18 02 - Another Song.mp3 -rw-r--r-- 1 rob rob 17381 2006-10-20 11:19 03 - Yet Another Song.mp3 -rw-r--r-- 1 rob rob 410075 2006-10-20 11:19 04 - A New Song.mp3 -rw-r--r-- 1 rob rob 7327 2006-10-20 11:19 05 - Some Instrumental Piece.mp3
Añadir un sufijo a varios archivos
$ ls -l
total 20 -rw-r--r-- 1 rob rob 733 2006-10-20 13:23 algebra -rw-r--r-- 1 rob rob 194 2006-10-20 13:23 calculus -rw-r--r-- 1 rob rob 117 2006-10-20 13:23 equations -rw-r--r-- 1 rob rob 402 2006-10-20 13:23 geometry -rw-r--r-- 1 rob rob 50 2006-10-20 13:23 matrices
En este ejemplo, me gustaría añadir un sufijo .txt
a cada archivo en este directorio.
No necesitamos sed
aquí:
$ for FILE in * ; do mv $FILE $FILE.txt ; done
$ ls -l
total 20 -rw-r--r-- 1 rob rob 733 2006-10-20 13:23 algebra.txt -rw-r--r-- 1 rob rob 194 2006-10-20 13:23 calculus.txt -rw-r--r-- 1 rob rob 117 2006-10-20 13:23 equations.txt -rw-r--r-- 1 rob rob 402 2006-10-20 13:23 geometry.txt -rw-r--r-- 1 rob rob 50 2006-10-20 13:23 matrices.txt
Añadir un prefijo
Tomando los archivos del ejemplo anterior:
$ ls -l
total 20 -rw-r--r-- 1 rob rob 733 2006-10-20 13:23 algebra.txt -rw-r--r-- 1 rob rob 194 2006-10-20 13:23 calculus.txt -rw-r--r-- 1 rob rob 117 2006-10-20 13:23 equations.txt -rw-r--r-- 1 rob rob 402 2006-10-20 13:23 geometry.txt -rw-r--r-- 1 rob rob 50 2006-10-20 13:23 matrices.txt
Me gustaría añadir un maths_
prefijo a cada archivo:
$ for FILE in * ; do mv $FILE maths_$FILE ; done
$ ls -l
total 20 -rw-r--r-- 1 rob rob 733 2006-10-20 13:23 maths_algebra.txt -rw-r--r-- 1 rob rob 194 2006-10-20 13:23 maths_calculus.txt -rw-r--r-- 1 rob rob 117 2006-10-20 13:23 maths_equations.txt -rw-r--r-- 1 rob rob 402 2006-10-20 13:23 maths_geometry.txt -rw-r--r-- 1 rob rob 50 2006-10-20 13:23 maths_matrices.txt
Eliminar un prefijo
Siguiendo con los archivos que hemos estado utilizando:
$ ls -l
total 20 -rw-r--r-- 1 rob rob 733 2006-10-20 13:23 maths_algebra.txt -rw-r--r-- 1 rob rob 194 2006-10-20 13:23 maths_calculus.txt -rw-r--r-- 1 rob rob 117 2006-10-20 13:23 maths_equations.txt -rw-r--r-- 1 rob rob 402 2006-10-20 13:23 maths_geometry.txt -rw-r--r-- 1 rob rob 50 2006-10-20 13:23 maths_matrices.txt
He cambiado de opinión respecto al prefijo maths_
y quiero eliminarlo.
$ for FILE in * ; do NEWFILE=`echo $FILE | sed 's/^maths_//'` ; mv $FILE $NEWFILE ; done
$ ls -l
total de 20 -Rw-r - r - 1 rob rob 733 2006-10-20 13:23 algebra.txt -Rw-r - r - 1 rob rob 194 2006-10-20 13:23 calculus.txt -Rw-r - r - 1 rob rob 117 2006-10-20 13:23 equations.txt -Rw-r - r - 1 rob rob 402 2006-10-20 13:23 geometry.txt -Rw-r - r - 1 rob rob 50 2006-10-20 13:23 matrices.txt
El símbolo ^
en sed
indica que debe coincidir con el comienzo de una línea.
eliminar un sufijo
Mientras estoy en ello, creo que voy a quitar el sufijo también.
$ for FILE in *.txt ; do NEWFILE=`echo $FILE | sed 's/.txt$//'` ; mv $FILE $NEWFILE ; done
$ ls -l
total 20 -rw-r--r-- 1 rob rob 733 2006-10-20 13:23 algebra -rw-r--r-- 1 rob rob 194 2006-10-20 13:23 calculus -rw-r--r-- 1 rob rob 117 2006-10-20 13:23 equations -rw-r--r-- 1 rob rob 402 2006-10-20 13:23 geometry -rw-r--r-- 1 rob rob 50 2006-10-20 13:23 matrices
El símbolo $
en sed
indica si coincide con el final de una línea.
De mayúsculas a minúsculas
$ ls -l
total 20 -rw-r--r-- 1 rob rob 733 2006-10-20 13:23 ALGEBRA -rw-r--r-- 1 rob rob 194 2006-10-20 13:23 CALCULUS -rw-r--r-- 1 rob rob 117 2006-10-20 13:23 EQUATIONS -rw-r--r-- 1 rob rob 402 2006-10-20 13:23 GEOMETRY -rw-r--r-- 1 rob rob 50 2006-10-20 13:23 MATRICES
$ for FILE in * ; do mv $FILE `echo $FILE | tr '[A-Z]' '[a-z]'` ; done
$ ls -l
total 20 -rw-r--r-- 1 rob rob 733 2006-10-20 13:23 algebra -rw-r--r-- 1 rob rob 194 2006-10-20 13:23 calculus -rw-r--r-- 1 rob rob 117 2006-10-20 13:23 equations -rw-r--r-- 1 rob rob 402 2006-10-20 13:23 geometry -rw-r--r-- 1 rob rob 50 2006-10-20 13:23 matrices
De mayúsculas a minúsculas (sólo sufijo)
$ ls -l
total 20 -rw-r--r-- 1 rob rob 733 2006-10-20 13:23 Algebra.TXT -rw-r--r-- 1 rob rob 194 2006-10-20 13:23 Calculus.TXT -rw-r--r-- 1 rob rob 117 2006-10-20 13:23 Equations.TXT -rw-r--r-- 1 rob rob 402 2006-10-20 13:23 Geometry.TXT -rw-r--r-- 1 rob rob 50 2006-10-20 13:23 Matrices.TXT
$ for FILE in *.TXT ; do NEWFILE=`echo $FILE | sed 's/.TXT$/.txt/'` ; mv $FILE $NEWFILE ; done
$ ls -l
total 20 -rw-r--r-- 1 rob rob 733 2006-10-20 13:23 Algebra.txt -rw-r--r-- 1 rob rob 194 2006-10-20 13:23 Calculus.txt -rw-r--r-- 1 rob rob 117 2006-10-20 13:23 Equations.txt -rw-r--r-- 1 rob rob 402 2006-10-20 13:23 Geometry.txt -rw-r--r-- 1 rob rob 50 2006-10-20 13:23 Matrices.txt
una situación poco probable
Por último, una situación poco probable. Tengo un montón de archivos con múltiples espacios y sufijos capitalizados. Quiero que los espacios cambien a un guión, salvo cuando haya dos o más espacios consecutivos, en el que necesito un solo subrayado. Mientras estamos en ello, si un espacio está al lado del punto de un prefijo, vamos a quitarlo. También quiero hacer los sufijos minúsculas. Hmm.
$ ls -l
total 20 -rw-r--r-- 1 rob rob 201 2006-10-23 23:44 A file with many spaces.TXT -rw-r--r-- 1 rob rob 1579 2006-10-23 23:44 Another wierdly named file.TXT -rw-r--r-- 1 rob rob 1452 2006-10-23 23:44 My mate Arron spels beter than this.txt -rw-r--r-- 1 rob rob 924 2006-10-23 23:44 Not really.TXT -rw-r--r-- 1 rob rob 379 2006-10-23 23:44 Whoo named this .TXT
I'm not going to try to correct the spelling as well!
$ for FILE in * ; do NEWFILE=`echo $FILE | sed -e 's/.TXT$/.txt/' -e 's/[ ]*[ ]/_/g' -e 's/_[.]/./g'` ; mv "$FILE" $NEWFILE ; done
$ ls -l
total 20 -rw-r--r-- 1 rob rob 201 2006-10-23 23:44 A_file_with_many_spaces.txt -rw-r--r-- 1 rob rob 1579 2006-10-23 23:44 Another_wierdly_named_file.txt -rw-r--r-- 1 rob rob 1452 2006-10-23 23:44 My_mate_Arron_spels_beter_than_this.txt -rw-r--r-- 1 rob rob 924 2006-10-23 23:44 Not_really.txt -rw-r--r-- 1 rob rob 379 2006-10-23 23:44 Whoo_named_this.txt
Eso fue un poco artificial, pero sí ofrece un ejemplo de la potencia de la línea de comandos.
Tenga en cuenta que algunas personas pagan por este tipo de funcionalidad. Eso sí, tenga en cuenta su opción .
apéndice
Dar a todos los archivos el mismo nombre, pero con un número diferente parece, bueno, tonto, pero vamos a hacerlo de todos modos. Los paréntesis son también una mala idea para los nombres de archivo, pero esto es sólo un ejercicio.
$ ls -l
total 20 -rw-r--r-- 1 rob rob 733 2006-10-20 13:23 algebra -rw-r--r-- 1 rob rob 194 2006-10-20 13:23 calculus -rw-r--r-- 1 rob rob 117 2006-10-20 13:23 equations -rw-r--r-- 1 rob rob 402 2006-10-20 13:23 geometry -rw-r--r-- 1 rob rob 50 2006-10-20 13:23 matrices
$ NUM=0 ; for FILE in * ; do NUM=`expr $NUM + 1` ; mv $FILE foolish\($NUM\) ; done
$ ls -l
total 20 -rw-r--r-- 1 rob rob 733 2006-10-20 13:23 foolish(1) -rw-r--r-- 1 rob rob 194 2006-10-20 13:23 foolish(2) -rw-r--r-- 1 rob rob 117 2006-10-20 13:23 foolish(3) -rw-r--r-- 1 rob rob 402 2006-10-20 13:23 foolish(4) -rw-r--r-- 1 rob rob 50 2006-10-20 13:23 foolish(5)
¿Qué sería más útil mantener el nombre original y separar el número secuencial con un subrayado
$ ls -l
total 20 -rw-r--r-- 1 rob rob 733 2006-10-20 13:23 algebra -rw-r--r-- 1 rob rob 194 2006-10-20 13:23 calculus -rw-r--r-- 1 rob rob 117 2006-10-20 13:23 equations -rw-r--r-- 1 rob rob 402 2006-10-20 13:23 geometry -rw-r--r-- 1 rob rob 50 2006-10-20 13:23 matrices
$ NUM=0 ; for FILE in * ; do NUM=`expr $NUM + 1` ; mv $FILE ${FILE}_$NUM ; done
$ ls -l
total 20 -rw-r--r-- 1 rob rob 733 2006-10-20 13:23 algebra_1 -rw-r--r-- 1 rob rob 194 2006-10-20 13:23 calculus_2 -rw-r--r-- 1 rob rob 117 2006-10-20 13:23 equations_3 -rw-r--r-- 1 rob rob 402 2006-10-20 13:23 geometry_4 -rw-r--r-- 1 rob rob 50 2006-10-20 13:23 matrices_5
No deje de leer nuestro estupendo tutorial sobre expresiones regulares.
Expresiones Regulares en Linux
-
Linux
- Predicciones de Linux para 2025
- Elementary OS 8: una distribución de Linux para usuarios de Windows y macOS
- Renombrar multiples archivos masivamente en Linux (quitar espacios, cambiar mayúsculas) a la vez en Linux
- He utilizado Linux durante 30 años. Aquí hay 5 razones por las que nunca cambiaré a Windows o MacOS
- Montar un directorio remoto, vía NFS, en Linux
- Mis predicciones sobre Linux para 2025: será un buen año
- ¿Por qué Torvalds eliminó a los encargados rusos del mantenimiento del núcleo de Linux?
- 10 cosas que siempre hago después de instalar Linux (y por qué tú también deberías hacerlo)
- 7 cosas que nunca hago después de instalar Linux (y por qué tú tampoco deberías)
- Detección de Intrusos: Snort, Base, MySQL, y Apache2 en Ubuntu Linux 7.10
- ¿Por qué no más personas usan Linux en el escritorio? Tengo una teoría que quizás no te guste.
- Los países occidentales ricos lideran la expansión mundial del petróleo y el gas
- Systemd 256.1 aborda la queja de que 'systemd-tmpfiles' podría eliminar inesperadamente su directorio /home
- Por qué un kernel Linux de distribución 'congelada' no es la mejor opción para la seguridad
- RebornOS es una versión hermosa y fácil de usar de Arch Linux con abundantes opciones de escritorio