批量重命名文件;排序哈希的问题



我想重命名一堆从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

最新更新