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(".")
Posted in dica rapida, Ruby Tagged with: , ,
4 comments on “Renomeando arquivos em ruby
  1. abstractj says:

    legal o post, talvez você resolveria com bash mesmo. Simplificando um pouco:

    for i in `ls *`;do cp $i $i.mp3; done

  2. tuna says:

    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

  3. Luiz says:

    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!

  4. Sergio Lopes says:

    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 ;

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>