Renomeando vários arquivos usando um loop

Renomeando vários arquivos usando um loop

Preciso renomear alguns arquivos usando um loop, mas não consigo fazer funcionar porque ainda sou muito novo no Linux. os arquivos que precisam ser renomeados são:

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

para um nome mais curto, como:

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

Eu usei renamee mvoutros loops que vi em threads, mas ainda não consigo fazê-lo funcionar. Qualquer entrada é muito apreciada! obrigado!

Responder1

Se você possui perl rename(padrão no Ubuntu, Debian e muitos outros sistemas), você pode simplesmente fazer

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

Se isso fornecer os nomes de arquivo corretos, execute sem -nrenomeá-los:

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

Responder2

Você pode tentar isso:

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

Responder3

Supondo que todos esses arquivos estejam no diretório atual e que todos eles, e nenhum outro arquivo, correspondam ao padrão globbing

E9-GOWN33_multiplemap.bin.*.fa

Então, você pode fazer um loop sobre eles com

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

Dentro do loop, $nameestará o nome de um desses arquivos.

Dado o nome E9-GOWN33_multiplemap.bin.10.faem $name, podemos remover o E9-GOWN33_multiplemapbit do início do nome com

${name#E9-GOWN33_multiplemap}

É então apenas uma questão de anexar novamente a E9string inicial à frente para criar E9.bin.10.fa:

newname=E9${name#E9-GOWN33_multiplemap}

Com mvpodemos então renomear o nome do arquivo antigo para o novo:

mv "$name" "$newname"

Então, com isso temos

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

ou mais curto,

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

Responder4

for f in *.fa; do mv -- "$f" "${f/-*p./.}"; done
  • entrada:
    E9-GOWN33_multiplemap.bin.7.fa
    E9-GOWN33_multiplemap.bin.10.fa
    E9-GOWN33_multiplemap.bin.16.fa
    E9-GOWN33_multiplemap.bin.21.fa
    
  • saída:
    E9.bin.7.fa
    E9.bin.10.fa
    E9.bin.16.fa
    E9.bin.21.fa
    

você também pode 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

Neste script, o loop for itera sobre os arquivos que correspondem ao padrão E9-GOWN33_multiplemap.bin.*.fa no diretório especificado. Dentro do loop, o nome do arquivo original é extraído usando basename. Em seguida, a parte numérica é extraída usando o awk. Finalmente, o novo nome do arquivo é construído combinando as partes fixas (E9.bin.) com o número extraído. O comando mv é usado para renomear o arquivo com o novo nome de arquivo.

informação relacionada