Renomeando um arquivo passando uma saída awk em um arquivo *.tsv

Renomeando um arquivo passando uma saída awk em um arquivo *.tsv

Tenha dados e *.tsvarquivo onde os dados são descritos. Gostaria de usar a descrição e renomear os dados de acordo.

Por favor, dê uma olhada :

  • awkcomando para filtrar o tsv dê isto:

      common_voice_en_22090684.mp3 four
      common_voice_en_22090691.mp3 no
      common_voice_en_22090696.mp3 one
    
  • vá até o diretório onde *.mp3estão:

    for i in *.mp3 ; do
    echo $i
    
  • mvé um comando para renomear o arquivo e leva dois argumentos (o arquivo a ser alterado e com quê)

Como usar awk(para ler e usar a descrição) e mv(para renomear os arquivos existentes com a descrição passada? Então, olhando o exemplo acima, o resultado seria:

four.mp3    
no.mp3  
one.mp3 

Não é importante usar os comandos sugeridos. Quaisquer ideias, sugestões de como fazer isso são bem-vindas!

Responder1

Isso não atende aos seus requisitos, mas se você espera processar muitos arquivos, poderá obter melhor desempenho usando seu .tsv como driver em vez de uma expansão de shell, porque você não abrirá o tsv uma vez por mp3. Remova o echose parecer que faria o que você espera.

$ while read -r src tgt; do [ -f "$src" ] && echo mv -i "$src" "$tgt.mp3"; done < file.tsv

Responder2

IIUC, você quer algo assim depois de salvar a saída deComando awk para filtrar o tsvno arquivo:

#!/usr/bin/env sh

for i in *.mp3
do
    new_name="$(awk -v name="$i" '$1 == name {print $2}' file)"
    if [ -n "$new_name" ]
    then
        echo mv -- "$i" "$new_name"
    fi
done

Remova echopara realmente renomear, mas execute-o primeiro para ter certeza de que será o que você precisa. Observe também que há uma pequena chance de mvfalha porque o arquivo original já terá sido excluído no momento em que a execução do script atingir essa linha - você pode usar set -epara sair imediatamente após a primeira mvfalha.

informação relacionada