2012-02-25 4 views
0

Я хочу переименовать и добавить числа в кучу файлов уроков, которые я загрузил с 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) 

EDIT:

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

я сделал сортировку с «names.index (names.values.sort [счетчик])»

+0

Как это возможно, что эта линия работает - имена [Sprintf «% 03d», счетчик] = строка, почему у вас есть второй параметр в квадрате кронштейны? – megas

+0

Это как-то не возможно? Это та часть, где мне присваиваются начальные нулевые числа. – cherrun

+0

извините, это параметры для sprintf, я его не узнал – megas

ответ

0

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

names.keys.sort.map do |key| 
    puts "#{key} #{names[key]}" 
end 
Смежные вопросы