Olá galera, tive um problema hoje, seguinte: baixei um disco da internet, onde as músicas vieram somente com os números, mas sem o nome das mesmas, pois os nomes vieram num arquivo TXT exemplo:

Pasta com as músicas:

Shell Script - Como renomear um diretório com dados de um arquivo

Então, criei um Script em Shell que pega a 1° linha do txt e renomea o primeiro arquivo do diretório, depois pega a 2° e renomea a segunda música do diretório…e assim por diante

Arquivo em TXT:

cat faixas.txt

01-Alceu Valença-Estação Da luz
02-Alceu Valença-Como Dois Animais
03-Alceu Valença-Tropicana
04-Alceu Valença-Petrolina Juazeiro
05-Alceu Valença-Anunciação
06-Alceu Valença-Coração Bobo
07-Alceu Valença-Solidão
08-Alceu Valença-Pelas Ruas Que Andei
09-Alceu Valença-Essa Menina
10-Alceu Valença-Cabelo No Pente
11-Alceu Valença-Leque Moleque
12-Alceu Valença-Girassol
13-Alceu Valença-O Ovo e a Galinha
14-Alceu Valença-Cantiga Do Sapo
15-Alceu Valença-Romance Da Bela Inês
16-Alceu Valença-Descida da Ladeira
17-Alceu Valença-Meu Forró Meu Canto
18-Alceu Valença-Rima Com Rima
19-Alceu Valença-Vou Pra Campinas
20-Alceu Valença-Eu Quero Ver Você Dizer Que Eu Sou Ruim
 

Levando em conta que no diretório também existiam outros arquivos que não eram música, ou seja, no formato JPG(Capa do disco) e o próprio arquivo com as músicas(faixas.txt), então o Script também deve ter a tarefa de NÃO renomeá-los. Com esse algoritmo na cabeça, criei o seguinte

✍ Primeiramente, como as músicas são em MP3, precisava que no arquivo final existisse o .mp3, então inclui uma linha que põe o ‘.mp3’ a palavra no final de cada linha:

sed -i 's/$/.mp3/' faixas.txt

✍ Conta a quantidade de arquivos no formato MP3 no diretório, onde ‘max’ seria a variável que me daria a quantidade dos arquivos:

max=$(ls *.mp3 | wc -l)

✍ Cria um diretório temporário

mkdir .temp

✍ Lista os arquivos em MP3 e a saída joga para um TXT na pasta temporária:

ls *.mp3 > .temp/lista_antiga_dos_arquivos.txt

✍ Um loop onde a sequencia(seq) iria do 1 ao ‘max’:

 for i in $(seq 1 $max)
 do
  #comandos
 done
 

Dentro do loop criado acima, coloque tais comandos:

♛ Lê a linha da lista criada com o ‘ls’ e joga um linha do loop para um outro arquivo, ainda na pasta temporária

sed "$i!d" .temp/lista_antiga_dos_arquivos.txt > .temp/uma_das_musicas_lista_VELHA.txt

♛ Armazena a linha(nome antigo, ex.: 01.mp3) numa variável:

velho=$(cat .temp/uma_das_musicas_lista_VELHA.txt)

♛ Agora lê a lista das faixas(COM OS NOMES QUE DESEJA-SE RENOMEAR) e também joga num outro arquivo temporário:

sed "$i!d" faixas.txt > .temp/uma_das_musicas_lista_NOVA.txt

♛ Armazena a linha(NOME NOVO DA MÚSICA) numa variável:

novo=$(cat .temp/uma_das_musicas_lista_NOVA.txt)

♛ Finalmente substitímos o nome dos arquivo(RENOMEAMOS)

mv "$velho" "$novo"

♛ Imprime o novo nome só para acompanhar a renomeação:

echo "$novo"

✍ E por fim, FORA DO LOOP, removemos a pasta temporária:

rm -rf .temp

Verifique o código completo do Script:

#!/bin/bash
# www.terminalroot.com.br
sed -i 's/$/.mp3/' faixas.txt
max=$(ls *.mp3 | wc -l)
mkdir .temp
ls *.mp3 > .temp/lista_antiga_dos_arquivos.txt
for i in $(seq 1 $max)
 do 
  sed "$i!d" .temp/lista_antiga_dos_arquivos.txt > .temp/uma_das_musicas_lista_VELHA.txt
  velho=$(cat .temp/uma_das_musicas_lista_VELHA.txt)
  sed "$i!d" faixas.txt > .temp/uma_das_musicas_lista_NOVA.txt
  novo=$(cat .temp/uma_das_musicas_lista_NOVA.txt)
  mv "$velho" "$novo"
  echo $novo
  
 done
 
rm -rf .temp

Por fim a pasta ficou assim

Shell Script - Como renomear um diretório com dados de um arquivo

Valeu!