Mover arquivos com base na lista de caminhos de arquivos antigos e novos

0

O que é uma maneira eficiente de renomear arquivos no OSX / BSD de um arquivo de texto para arquivos que supostamente permanecem na pasta original, mas no formato de;

/path/old file name.ext\tnew file name.ext

Pode haver milhares de entradas usando o delimitador TAB entre as entradas e qualquer delimitador de linha usado no Windows, OSX ou Linux.

Os nomes dos arquivos podem conter qualquer caractere válido, incluindo _ '!? ~ * & ^% $ # @ ,. ∑´® † ¥ ¨ˆ¬˚∆˙ © ƒ & Caracteres de fonte asiáticos

Os nomes terminam com uma extensão pontilhada, por ex. .xxx .

    
por Tony EE rocketscientist 20.05.2012 / 17:24

1 resposta

2

Versão atualizada:

Este leva como especificação:

  • Cada declaração em uma linha
  • Os registros são separados por um caractere \t .

Isso facilita muito:

require 'fileutils'
File.open("input.txt", 'r').each_line do |l|
  next if l.strip.empty?
  f = l.split("\t")
  dir = File.dirname f[0]
  if File.exists? f[0]
    p "Moving #{f[0]} to #{dir}/#{f[1].strip}"
    # FileUtils.mv f[0], "#{dir}/#{f[1].strip}"
  else
    p "#{f[0]} does not exist."
  end
end

Salve isso como um arquivo e chame-o com ruby filename.rb . Ele lerá input.txt no mesmo diretório e apenas moverá os arquivos.

Descomente a linha # FileUtils… para realmente mover alguma coisa. Isso deve informar se o arquivo original não pode ser encontrado.

Sua especificação de entrada original foi:

  • Cada declaração em uma linha
  • Os registros não são terminados ou separados, exceto por sua extensão
  • Os registros podem conter espaços e o delimitador pode ter vários espaços ("pelo menos 1 espaço")

Portanto, é preciso retroceder para corresponder à primeira extensão de arquivo e, em seguida, interpretá-la como o primeiro argumento. Então, precisamos remover essa parte da linha original, remover os espaços em branco inicial e final e construir o comando mv .

Suposições adicionais:

  • Todas as extensões têm apenas três caracteres, não mais, não menos
  • Os nomes dos arquivos não contêm um ponto (caso contrário, isso é interrompido)

Já que você está no OS X, vamos usar o Ruby:

require 'fileutils'
File.open("input.txt", 'r').each_line do |l|
  next if l.strip.empty?
  old_file = l[0, l.index(/\.[a-z0-9]{3}/i) + 4]
  dir = File.dirname old_file
  new_filename = l.sub(old_file, '').lstrip.chomp
  p "Moving #{old_file} to #{dir}/#{new_filename}"
  # FileUtils.mv old_file, "#{dir}/#{new_filename}"
end
    
por 20.05.2012 / 18:36