Cambiar el nombre de varios archivos usando un bucle

Cambiar el nombre de varios archivos usando un bucle

Necesito cambiar el nombre de algunos archivos usando un bucle pero no puedo hacerlo funcionar porque todavía soy muy nuevo en Linux. Los archivos que deben cambiarse de nombre son:

E9-GOWN33_multiplemap.bin.10.fa  
E9-GOWN33_multiplemap.bin.16.fa  
E9-GOWN33_multiplemap.bin.21.fa  
E9-GOWN33_multiplemap.bin.7.fa

a un nombre más corto como:

E9.bin.10.fa
E9.bin.16.fa
E9.bin.21.fa
E9.bin.7.fa

He usado renamey mvotros bucles que he visto en hilos pero todavía no puedo hacerlo funcionar. ¡Cualquier aporte se agradecerá! ¡gracias!

Respuesta1

Si tiene Perl rename(predeterminado en Ubuntu, Debian y muchos otros sistemas), puede simplemente hacer

rename -n 's/-GOWN33_multiplemap//' ./*fa

Si eso le proporciona los nombres de archivo correctos, ejecútelo sin -npara cambiarles el nombre:

rename 's/-GOWN33_multiplemap//' ./*fa

Respuesta2

Puedes probar esto:

for f in *.fa; do 
  echo mv -- "$f" "${f%-*}.${f#*.}"
done

Resultado:

E9.bin.10.fa
E9.bin.16.fa
E9.bin.21.fa
E9.bin.7.fa

Respuesta3

Suponiendo que todos esos archivos están en el directorio actual y que todos ellos, y ningún otro archivo, coinciden con el patrón global

E9-GOWN33_multiplemap.bin.*.fa

Luego, puedes recorrerlos con

for name in E9-GOWN33_multiplemap.bin.*.fa; do
   # more code here
done

Dentro del bucle, $nameestará el nombre de uno de estos archivos.

Dado el nombre E9-GOWN33_multiplemap.bin.10.faen $name, podemos eliminar el E9-GOWN33_multiplemapbit del inicio del nombre con

${name#E9-GOWN33_multiplemap}

Entonces es solo cuestión de volver a adjuntar la E9cadena inicial al frente para crear E9.bin.10.fa:

newname=E9${name#E9-GOWN33_multiplemap}

Luego mvpodemos cambiar el nombre del archivo antiguo al nuevo:

mv "$name" "$newname"

Entonces con eso tenemos

for name in E9-GOWN33_multiplemap.bin.*.fa; do
    newname=E9${name#E9-GOWN33_multiplemap}
    mv "$name" "$newname"
done

o más corto,

for name in E9-GOWN33_multiplemap.bin.*.fa; do
    mv "$name" "E9${name#E9-GOWN33_multiplemap}"
done

Respuesta4

for f in *.fa; do mv -- "$f" "${f/-*p./.}"; done
  • aporte:
    E9-GOWN33_multiplemap.bin.7.fa
    E9-GOWN33_multiplemap.bin.10.fa
    E9-GOWN33_multiplemap.bin.16.fa
    E9-GOWN33_multiplemap.bin.21.fa
    
  • producción:
    E9.bin.7.fa
    E9.bin.10.fa
    E9.bin.16.fa
    E9.bin.21.fa
    

También puedes usar este script:

#!/bin/bash

# Set the directory path where the files are located
directory="/path/to/files"

# Loop through the files in the directory
for file in "$directory"/E9-GOWN33_multiplemap.bin.*.fa; do
    # Extract the original filename
    filename=$(basename "$file")
    
    # Extract the numeric part from the original filename
    number=$(echo "$filename" | awk -F'.' '{ print $3 }')
    
    # Create the new filename
    new_filename="E9.bin.$number.fa"
    
    # Rename the file
    mv "$file" "$directory/$new_filename"
done

En este script, el bucle for itera sobre los archivos que coinciden con el patrón E9-GOWN33_multiplemap.bin.*.fa en el directorio especificado. Dentro del bucle, el nombre del archivo original se extrae utilizando el nombre base. Luego, la parte numérica se extrae usando awk. Finalmente, el nuevo nombre de archivo se construye combinando las partes fijas (E9.bin.) con el número extraído. El comando mv se utiliza para cambiar el nombre del archivo con el nuevo nombre.

información relacionada