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