¿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?

Paul
fuente
¿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.

Kevin
fuente
¿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í .

alexg
fuente
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:]]
Chris Down
fuente
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 -
gopherIT
fuente