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

Ruby 批量重命名文件;哈希排序问题,ruby,hash,rename,file-rename,Ruby,Hash,Rename,File Rename,我想重命名一些课程文件,并给它们添加编号,这些文件是我从YouTube上下载的。然而,它们的顺序是错误的。我有一张名单,上面有所有正确的名字,按他们被监视的顺序排列 因此,我的想法是获取该列表,用键对它们进行散列,稍后将用作文件编号,值将是实际的文件名。之后,我将对密钥的哈希进行排序,遍历我的目录,并重命名目录中包含的所有文件 我现在有以下代码: 1 #!/usr/bin/ruby 2 3 counter = 0 4 5 folder_path = "SOME_PATH" 6 n

我想重命名一些课程文件,并给它们添加编号,这些文件是我从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

这一行是如何工作的-name[sprintf'%03d',counter]=行,为什么在方括号中有第二个参数?这是不可能的吗?这是分配给我前导零的部分。对不起,这是sprintf的参数,我不认识它