2017-02-15 32 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

相關問題