¿Cómo puedo cambiar el nombre de varios archivos eliminando un carácter o cadena?


21

Como seguimiento a mi pregunta anterior , si tengo varios archivos del formulario

sw.ras.001
sw.ras.002
sw.ras.003
…

¿Qué comando puedo usar para eliminar el ras.en medio de todos los archivos?


¿Desea eliminar solo el ras, es decir, terminar con sw..001, o el ras., dejando sw.001?
Kevin

Probablemente quisiera eliminar el 'ras'. ¿El comando sería muy diferente?
Paul

No, solo si incluye el \.en los patrones.
Kevin

Respuestas:


35

Puede hacer esto con una modificación bastante pequeña de cualquiera de las respuestas de la última pregunta:

rename s/ras\.// sw.ras.*

o

for file in sw.ras.*; do
    mv "$file" "${file/ras./}"
done

Explicación:

renamees un perlscript que toma una perlexpresión regular y una lista de archivos, aplica la expresión regular al nombre de cada archivo a su vez y cambia el nombre de cada archivo al resultado de aplicar la expresión regular. En nuestro caso, rascoincide literalmente y \.coincide con un literal .(ya que .solo indica cualquier carácter que no sea una nueva línea), y lo reemplaza con nada.

El forbucle toma todos los archivos que comienzan con sw.ras.(shell glob estándar) y los repite. ${var/search/replace}búsquedas $varpara searchy reemplaza la primera ocurrencia con replace, por lo que ${file/ras./}regresa $filecon el primer ras.eliminado. El comando cambia el nombre del archivo al mismo nombre menos ras.. Tenga en cuenta que con esta búsqueda y reemplazo, .se toma literalmente, no como un carácter especial.


¿Podría explicar su respuesta a otros que están aprendiendo? ¿Qué hace "s / ras \ .// sw.ras. *"? Supongo que lo sé, pero quiero estar seguro, y otros también pueden aprender. Segunda opción de la misma manera.
H_7

1
@ H_7 Buena idea, he agregado una explicación.
Kevin

14

Otra opción es usar mmv (Mass MoVe y renombrar):

mmv '*ras.*' '#1#2'

No olvides usar las comillas simples alrededor de tus patrones, de lo contrario las estrellas se expandirán a nivel de caparazón.

La utilidad no siempre está disponible, pero si no lo está, puede instalarla con:

sudo apt-get install mmv

Vea la página de aquí .


1
¡Esa es una gran herramienta!
Christian

5

En cualquier shell POSIX-compatible ( bash, dash, ksh, etc):

for file in sw.ras.[[:digit:]][[:digit:]][[:digit:]]; do
    mv "${file}" "${file/ras\./}"
done

O con rename:

rename 's/ras\.//' sw.ras.[[:digit:]][[:digit:]][[:digit:]]

1

Recientemente tuve que hacer un cambio de nombre masivo de una serie de archivos donde tuve que reemplazar la última aparición de un personaje donde el personaje ocurrió varias veces en los nombres de archivo. En este caso particular, tuve que reemplazar el último guión -con un guión bajo _, convirtiendo esto:

some-long-file-name.ext

dentro de esto:

some-long-file_name.ext

Tomó algo de tiempo, pero finalmente lo logró:

for FILE in *; do mv $FILE ${FILE%-*}_${FILE##*-}; done

Aquí:

  • ${i%-*} coincide con el comienzo del nombre del archivo hasta la última aparición del guión -
  • ${file##*-} coincide con el resto del nombre de archivo después de la última aparición del guión -
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.