renomeia um lote de arquivos após a leitura de um arquivo de origem

1

Eu tenho um diretório cheio de mais de mil arquivos e os nomes são um pouco longos (e nenhum padrão foi encontrado no estilo de nomeação). Eu gostaria de simplificar os nomes dos arquivos. Por exemplo:

Bioimage_23335989_Data_22317866_22317867_20140723_1002.pdb
Bioimage_22335990_Data_22318490_22318491_20140723_1009.pdb
Bioimage_23835970_Data_22317866_22317867_20140723_1005.pdb

..... e assim por diante!

Eu fiz um arquivo de texto simples ( filelist.txt ) que é assim:

1.pdb   Bioimage_23335989_Data_22317866_22317867_20140723_1002.pdb
2.pdb   Bioimage_22335990_Data_22318490_22318491_20140723_1009.pdb
3.pdb   Bioimage_23835970_Data_22317866_22317867_20140723_1005.pdb

..... e assim por diante!

Alguém pode me fornecer um script ( awk , sed , etc) que iria ler o arquivo de origem e renomear os arquivos adequadamente? Eu poderia pegar scripts semelhantes em outros lugares, mas nada parece funcionar para mim.

    
por Tofayel 31.07.2014 / 05:36

2 respostas

1

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 para mv . 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 .

    
por 31.07.2014 / 06:21
0
while read tname fname
do
  mv ${fname} ${tname}
done < filelist.txt
    
por 31.07.2014 / 07:29