
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 rename
e mv
outros 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 -n
renomeá-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, $name
estará o nome de um desses arquivos.
Dado o nome E9-GOWN33_multiplemap.bin.10.fa
em $name
, podemos remover o E9-GOWN33_multiplemap
bit do início do nome com
${name#E9-GOWN33_multiplemap}
É então apenas uma questão de anexar novamente a E9
string inicial à frente para criar E9.bin.10.fa
:
newname=E9${name#E9-GOWN33_multiplemap}
Com mv
podemos 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.