LinuxParty

NUESTRO SITIO necesita la publicidad para costear hosting y el dominio. Por favor considera deshabilitar tu AdBlock en nuestro sitio. También puedes hacernos una donación entrando en linuxparty.es, en la columna de la derecha.
Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado
 

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


No estás registrado para postear comentarios



Redes:



   

 

Suscribete / Newsletter

Suscribete a nuestras Newsletter y periódicamente recibirás un resumen de las noticias publicadas.

Donar a LinuxParty

Probablemente te niegues, pero.. ¿Podrías ayudarnos con una donación?


Tutorial de Linux

Filtro por Categorías