Какой эффективный способ переименовать файлы в OSX/BSD из текстового файла для файлов, которые, как предполагается, остаются в исходной папке, но в формате;

/path/old file name.ext \t new file name.ext

Можно сказать, что тысячи записей используют разделитель TAB между записями и любой разделитель строк, используемый в Windows, OSX или Linux.

Имена файлов могут содержать любые допустимые символы, включая _ '!?~ * & ^% $ # @ ,.∑´® † ¥ ¨ˆ¬˚∆˙ © ƒ и символы азиатского шрифта

Имена оканчиваются точечным расширением, например .xxx .

1 ответ1

2

Обновленная версия:

Этот принимает в качестве спецификации:

  • Каждое утверждение в одной строке
  • Записи разделяются символом \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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .