为什么Dir.glob只评估循环中的最后一个文件

时间:2017-02-15 02:46:56

标签: ruby

我正在尝试在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文件时,得到的结果是:

here is the file I want to look for: 0001.txt
here is the file I want to look for: 0002.txt
now I am working on /Users/bob/code/find-file/subdir/0002.txt

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

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

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

所以答案是:

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

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