我想重命名一堆从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])"进行排序
当您键入names.keys
时,您得到的是一个键数组,而不是散列,然后对其进行排序不会影响散列。如果你想以排序的方式打印哈希,你可以这样做:
names.keys.sort.map do |key|
puts "#{key} #{names[key]}"
end