Como renomear arquivos tar.gz com base em sua correspondência no arquivo de texto

3

Tenho muitos arquivos tar.gz em uma pasta em minha máquina Linux e também arquivos de texto com nomes de arquivos tar.gz e nomes de amostras correspondentes.

Current_directory
      |_______TDF.tar.gz
      |_______DFG.tar.gz
      |_______GHY.tar.gz

O arquivo names.txt que está no diretório atual se parece com o seguinte:

Tar.gz_filenames       Sample_Names
DFG.tar.gz                Sample2
TDF.tar.gz                Sample1
GHY.tar.gz                Sample3

Portanto, com base na correspondência deles, eu quero a seguinte saída em meu Current_directory.

Output:

Sample1.tar.gz
Sample2.tar.gz
Sample3.tar.gz

Eu tentei seguir, mas não funcionou:

for j in .tar.gz ; do
  sed "s/\(\w\+\)\s\+\(\w\+\)/mv '*_$j' '*_$j'/e" names.txt
done

Pequena atualização na minha pergunta: Quando usei este comando cat -e names.txt vejo como segue:

Tar.gz_filenames    Sample_Names^M$
DFG.tar.gz  Sample2^M$
TDF.tar.gz  Sample1^M$
GHY.tar.gz  Sample3
    
por user3351523 20.04.2018 / 17:44

4 respostas

1

Outra maneira de supor que nenhum espaço em branco está presente no nome dos arquivos:

$ xargs -n2 echo mv -i <<<"$(sed '1d; s/$/.tar.gz/' names.txt)"
mv -i TDF.tar.gz Sample1.tar.gz
mv -i DFG.tar.gz Sample2.tar.gz
mv -i GHY.tar.gz Sample3.tar.gz

Em sed '1d; s/$/.tar.gz/' , o 1d está excluindo a primeira linha do arquivo de entradaName names.txt , em seguida, o s/$/.tar.gz/ adiciona .tar.gz no final de cada linha (o $ ponits até o final da linha ).

Em xargs -n2 , estamos lendo dois conjuntos de strings separados por Espaço / ou Tab.

Notas:

  • Com base na saída de cat -e names.txt de seu arquivo não é o formato de fim de linha do tipo Unix, para convertê-lo para o tipo Unix do dos2unix fileName , aplique o comando acima para renomear.

  • remova echo para execução a seco.

link para O que é ^M e como me livrar dele?

    
por 20.04.2018 / 18:20
0

Supondo que seus nomes nunca tenham espaço em branco e que seu arquivo names.txt tenha um cabeçalho na primeira linha, conforme mostrado, você pode fazer:

tail -n +2 names.txt | while read old new; do
    mv -i "$old" "$new"
done 

O tail -n +2 imprimirá todas as linhas do arquivo a partir do segundo, então ele irá pular o cabeçalho. Então, a opção -i para o GNU mv diz para avisar antes de sobrescrever um arquivo existente (apenas no caso de haver um confronto de nome).

    
por 20.04.2018 / 18:04
0

Usando o shell: Suponho que os nomes do tarfile não contenham espaços e os nomes de amostra não contenham espaços:

{
    read header
    while read -r tarfile sample; do
        if [[ -f "$tarfile" ]]; then
            echo mv "$tarfile" "$sample.tar.gz"
        fi
    done
} < names.txt
    
por 20.04.2018 / 18:08
0

Um comando sed deve ser suficiente, dado o formato do arquivo de entrada:

sed '1!{s/^/mv /;s/$/.tar.gz/e}' names.txt

Demo, sem o e :

sed '1!{s/^/mv /;s/$/.tar.gz/}' names.txt

Saída:

Tar.gz_filenames       Sample_Names
mv TDF.tar.gz                Sample1.tar.gz
mv DFG.tar.gz                Sample2.tar.gz
mv GHY.tar.gz                Sample3.tar.gz
    
por 20.04.2018 / 18:11