2012-02-25 62 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) 

編輯:

哇,是我不好。我沒有檢查names.txt。它實際上有一個正斜槓的名字。因此,導致上述錯誤信息。

我做了排序「names.index(names.values.sort [計數器])」

+0

它是如何可能的,這行工作的 - 名[sprintf的「%03D」,​​計數器] =行,你爲什麼有方形的第二個參數括號? – megas 2012-02-25 09:46:31

+0

這是不可能的?這是我分配前導零號碼的部分。 – cherrun 2012-02-25 10:05:24

+0

對不起,它是sprintf的參數,我沒有認出它 – megas 2012-02-25 10:07:46

回答

0

當你輸入names.keys你有鑰匙的陣列,而不是哈希,然後分揀它沒」不會影響你的散列。如果你想打印在排序的單向散列,你可以這樣做:

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