2017-02-15 54 views
0

我正试图在ruby中编写一个文件搜索实用程序,它需要在txt文件中找到的文件名列表并搜索我的整个计算机中的这些文件。如果找到其中一个文件,那么该文件将被移动到不同的目录(有效地将其从找到的目录中删除)。为什么Dir.glob只评估循环中的最后一个文件

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

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 

的样本文件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

缩进对理解很重要,特别是一目了然。尽量组织尽可能有组织的代码,以避免模糊或混淆。 – tadman

+0

如果您遇到性能问题,最好''Dir.glob(“**/*”)'一次获取所有内容,然后使用'grep'查找该列表中的文件。 – tadman

+0

我将来会更加小心。谢谢。 – simplytrue

回答

1

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

所以答案是:

1)使用file_name.strip作为搜索词,所以任何多余的空格不是实际所需的文件名的一部分被修整了。否则Dir.glob将失败,因为它将最终搜索带有换行符的文件/模式。

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

+0

谢谢你的回答。添加file_name.strip工作。现在到公用事业的其余部分。 – simplytrue

相关问题