
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 rename
y mv
otros 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 -n
para 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, $name
estará el nombre de uno de estos archivos.
Dado el nombre E9-GOWN33_multiplemap.bin.10.fa
en $name
, podemos eliminar el E9-GOWN33_multiplemap
bit del inicio del nombre con
${name#E9-GOWN33_multiplemap}
Entonces es solo cuestión de volver a adjuntar la E9
cadena inicial al frente para crear E9.bin.10.fa
:
newname=E9${name#E9-GOWN33_multiplemap}
Luego mv
podemos 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.