【发布时间】:2012-03-15 11:23:41
【问题描述】:
我想为我从 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[sprintf '%03d', counter] = line,为什么方括号中有第二个参数?
-
这不可能吗?这就是我被分配前导零数字的部分。
-
对不起,是sprintf的参数,我没认出来
标签: ruby hash rename file-rename