Пакетное переименование файлов; проблемы с сортировкой хешей - PullRequest
0 голосов
/ 25 февраля 2012

Я хочу переименовать и добавить номера в кучу файлов уроков, которые я скачал с YouTube.Они, однако, в неправильном порядке.У меня есть список всех правильных имен в порядке их просмотра.

Так что моя идея состоит в том, чтобы взять этот список, создать из него хеш-коды с ключами, которые впоследствии будут использоваться в качестве нумерации файлов, а значением будет фактическое имя файла.После этого я буду сортировать свои хэши для ключей, перебирать свой каталог и переименовывать все файлы, включенные в каталог.

У меня есть следующий код прямо сейчас:

 1 #!/usr/bin/ruby
 2 
 3 counter = 0
 4 
 5 folder_path = "SOME_PATH"
 6 names = Hash.new
 7 
 8 file = File.new("names.txt", "r")
 9 while (line = file.gets)
10     #puts "#{counter}: #{line}"
11     names[sprintf '%03d', counter] = line
12     counter += 1
13 end
14 file.close
15 
16 puts "======== Names before sorting: \n ========"
17 puts names
18 
19 names.keys.sort
20 
21 puts "======== Names after sorting: \n ========"
22 puts names
23 
24 
25 
26 new_filename = ""
27 counter = 0
28 Dir.glob(folder_path + "/*").each do |f|
29         #puts "#{counter}: #{File.basename(f, File.extname(f))}"
30         numbering = (sprintf '%03d', counter)
31         new_filename = numbering + " - " + names[numbering]
32 
33         File.rename(f, folder_path + "/" + new_filename + File.extname(f))
34         counter += 1
35 end
36 
37 puts "Renaming complete."

Проблемытеперь мои хеши не сортируются.Я думаю, это потому, что мои значения ключей на самом деле являются строковыми, а не числами, но как иначе я достигну нулей ведущих для моего переименования?

Сам процесс переименования тоже не совсем работает.Кажется, это работает для первых двух видео, но затем я получаю следующее сообщение об ошибке:

main.rb:33:in `rename': No such file or directory - PATH - .mp4 or PATH -  - Dot and Cross Product Comparison/Intuition (Errno::ENOENT)

РЕДАКТИРОВАТЬ:

Ух ты, мой плохой.Я не проверял names.txt.На самом деле это было имя с косой чертой.Таким образом, вызывая вышеприведенное сообщение об ошибке.

Я выполнил сортировку с 'names.index (names.values.sort [counter])'

1 Ответ

0 голосов
/ 25 февраля 2012

Когда вы набрали names.keys, вы получили массив ключей, а не хеш, тогда сортировка не повлияла на ваш хеш.Если вы хотите распечатать хэш отсортированным способом, вы можете сделать это так:

names.keys.sort.map do |key|
  puts "#{key} #{names[key]}"
end
...