Tenha dados e *.tsv
arquivo onde os dados são descritos. Gostaria de usar a descrição e renomear os dados de acordo.
Por favor, dê uma olhada :
awk
comando 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
*.mp3
estã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 echo
se 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 echo
para 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 mv
falha 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 -e
para sair imediatamente após a primeira mv
falha.