By Marcos Oliveira,

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!

Curso Extremamente Avançado em Shell Script Bash

Você irá descobrir técnicas avançadas de escrever em Shell Script. Como criar instaladores para distribuições Linux, Animações, Documentações, além de tudo sobre Processos em sistemas tipo UNIX, detalhes sobre Comandos Avançados e Muito Mais !