【问题标题】:Why is Dir.glob only evaluate the last file in loop为什么 Dir.glob 只评估循环中的最后一个文件
【发布时间】:2017-02-15 22:33:38
【问题描述】:

我正在尝试用 ruby​​ 编写一个文件搜索实用程序,它获取在 txt 文件中找到的文件名列表,并在我的整个计算机中搜索这些文件。如果找到这些文件之一,则该文件将被移动到不同的目录(有效地将其从找到的目录中删除)。

搜索必须自上而下遍历所有文件夹。到目前为止,我有以下代码:

File.open("sample-file-list.txt") do |name|  # open file with 
    name.each_line do |file_name|
        puts "here is the file I want to look for: #{file_name}"

        folder = "/Users/bob/code/find-file"
        Dir.glob("#{folder}/**/#{file_name}") do |file|
            puts "now I am working on #{file}"
        end
    end
end

sample-file-list.txt 文件包含以下条目:

0001.txt 0002.txt

在上面的文件夹中,我有一个名为“0001.txt”的文件。我在名为 subdir 的文件夹中还有一个子文件夹,其中包含名为“0002.txt”的文件。

当我在终端运行 ruby​​ 文件时,我得到的结果是:

这是我要查找的文件:0001.txt 这是我要查找的文件:0002.txt 现在我正在处理 /Users/bob/code/find-file/subdir/0002.txt

我的代码只发现将最后一个文件放在 0002.txt 中。但它似乎出于某种原因跳过了 0001.txt 文件。

作为旁注,我宁愿不使用 Dir.glob,因为它会包含很多文件,但 Dir.each 至少不会通过子目录,我似乎无法找到它 - 但这是另一个问题。

任何帮助将不胜感激。

【问题讨论】:

  • 缩进对于理解很重要,尤其是一目了然。尽量让问题中的代码井井有条,以避免歧义或混淆。
  • 如果您遇到性能问题,最好使用Dir.glob("**/*") 一次获取所有内容,然后使用grep 在该列表中查找文件。
  • 以后我会更加小心。谢谢。

标签: ruby


【解决方案1】:

除了您要查找的文件名之外,您读取的文件的每一行还包含一个换行符,假设为\n。这将包含在您从each_line 获得的字符串中。

所以答案是:

1) 使用file_name.strip 作为搜索词,这样任何实际上不属于所需文件名的多余空格都会被删除。否则Dir.glob 将失败,因为它将搜索最后带有换行符的文件/模式。

2) 找到测试用例中的最后一个文件,因为文件末尾没有换行符。如果添加一个(即文件的最后一行为空),脚本将找不到列表中的最后一个实际文件。

【讨论】:

  • 感谢您的回答。添加 file_name.strip 有效。现在进入实用程序的其余部分。
猜你喜欢
  • 2011-12-18
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 2022-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多