【问题标题】:Batch rename files; problems with sorting hashes批量重命名文件;哈希排序问题
【发布时间】: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


【解决方案1】:

当您输入 names.keys 时,您会得到一个键数组,而不是哈希,然后对其进行排序不会影响您的哈希。如果你想以排序方式打印哈希,你可以这样做:

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

【讨论】:

    猜你喜欢
    • 2014-02-06
    • 1970-01-01
    • 2014-01-23
    • 2021-03-06
    • 2013-12-31
    • 2014-04-22
    • 2013-12-19
    • 2017-04-20
    相关资源
    最近更新 更多