Não é necessário o awk ou o sed, pois o seu filelist.txt
já está no formato perfeito.
Algumas coisas antecipadamente ... Presumo que não haja espaços em branco nos nomes dos arquivos e que um espaço separe os dois nomes de arquivos em cada linha. Além disso, suponho que filelist.txt
termine com um EOL antes do início EOF.
Claro, faça um backup do diretório antes de executar este comando.
#!/usr/bin/env bash
cd /path/to/pdb_files
while read -r line; do
mv $line
done < /path/to/filelist.txt
Explicação
-
while read -r line; do
: itera em cada linha do arquivo, colocando cada linha na variável$line
. -
mv $line
: Como cada linha contém dois nomes de arquivos separados por um espaço, podemos passar os argumentos diretamente paramv
. Ou seja, ele moverá imediatamente os arquivos do primeiro nome de arquivo para o segundo.
EDITAR
Acabei de reler sua pergunta. Eu interpretei isso como você deseja renomear arquivos de (por exemplo) 1.pdb
para Bioimage_23335989_Data_22317866_22317867_20140723_1002.pdb
. Eu não tenho certeza se você queria o contrário. Em caso afirmativo, o seguinte script funcionaria em seu lugar.
#!/usr/bin/env bash
cd /path/to/pdb_files
while read -r line; do
mv $(awk '{print $2, $1}' <<<$line)
done < /path/to/filelist.txt
Explicação
* mv $(awk '{print $2, $1}' <<<$line)
: leia de $line
e imprima o segundo campo seguido pelo primeiro campo. Passe esses dois nomes de arquivos como parâmetros para mv
.