Обновленная версия:
Этот принимает в качестве спецификации:
- Каждое утверждение в одной строке
- Записи разделяются символом
\t
.
Это делает это намного проще:
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
Сохраните это как файл и назовите его ruby filename.rb
. Он будет читать из input.txt
в том же каталоге и просто перемещать файлы.
Раскомментируйте строку # FileUtils…
чтобы он действительно что-то переместил. Это должно сказать вам, если оригинальный файл не может быть найден.
Ваша первоначальная спецификация ввода была:
- Каждое утверждение в одной строке
- Записи не прекращаются и не разделяются, за исключением их продления
- Записи могут содержать пробелы, а разделитель может состоять из нескольких пробелов ("хотя бы 1 пробел")
Поэтому необходимо вернуться к совпадению с первым расширением файла, а затем интерпретировать это как первый аргумент. Затем нам нужно удалить эту часть из исходной строки, удалить начальные и конечные пробелы и создать команду mv
.
Дополнительные предположения:
- Все расширения имеют только три символа, не больше, не меньше
- Сами имена файлов не содержат точку (в противном случае это разрывается)
Поскольку вы работаете в OS X, давайте просто использовать 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