Renomeando arquivos em ruby
Primeiro post do ano ressuscitando a categoria dica rápida.
Há uma ou duas semanas o PotHix me passou umas músicas, mas na hora de copiar, todos os arquivos vieram sem extensão. Depois de perder um tempo tentando resolver com bash, eu desisti e resolvi o problema em 10 min usando ruby. Se alguém puder postar nos comentários a solução em bash eu agradeço!
Para a minha solução usei apenas os seguintes métodos:
#Retorna um array de strings com todos os arquivos do diretório.
Dir.entries("dir")
#Retorna se o arquivo é um diretório ou não.
File.directory?("arquivo")
#Renomeia o arquivo.
File.rename("nome_antigo", "nome_novo")
Minha solução final ficou assim:
def rename_in_dir(dir)
files = Dir.entries(dir)
files.each do |f|
# Usei esse if para ignorar os arquivos que já tinham
# extensão e as referências '.' e '..'
next if f == "." or f == ".." or f =~ /.*\..{2,4}$/
# é importante sempre usar o diretório junto, se não ele vai
# procurar sempre no diretório onde o script está sendo executado
if File.directory?("#{dir}/#{f}")
# Se for um diretório faz a chamada recursiva
puts "DIR: #{dir}/#{f}"
rename_in_dir("#{dir}/#{f}")
else
puts "renaming: #{dir}/#{f}"
# Adiciona a extensão .mp3 no arquivo
File.rename("#{dir}/#{f}", "#{dir}/#{f}.mp3")
end
end
end
# Começa a partir do diretório onde o arquivo está
rename_in_dir(".")
legal o post, talvez você resolveria com bash mesmo. Simplificando um pouco:
for i in `ls *`;do cp $i $i.mp3; done
isso ?
$ cd tmp
$ mkdir in out
$ for a in `seq 1 10`; do touch in/$a; done
$ ls in
1 10 2 3 4 5 6 7 8 9
$ ls out
$ for a in `ls in`; do `cp in/$a out/$a.mp3`; done
$ ls out
1.mp3 10.mp3 2.mp3 3.mp3 4.mp3 5.mp3 6.mp3 7.mp3 8.mp3 9.mp3
Oi, David
Acho que dá pra fazer assim c/ bash:
for f in $(ls); do
if [ ! -d $f ]; then # se não é diretório
tem_extensao=$(echo $f | grep -c ‘.*\..\{2,4\}$’)
if [ $tem_extensao -eq 0 ]; then
mv $f $f.mp3
fi
fi
end
Levei uns 10 minutos também brigando com a sintaxe do bash… :)
Abraço!
Poxa pessoal, meia linha de bash resolve né! E ainda recursivo, algo que ninguém tratou nos outros comentários :)
find . -type f -exec mv {} {}.mp3 \;