2017-02-15 8 views
0

ruby​​でファイル検索ユーティリティを作成しようとしています。これはtxtファイルのファイル名のリストを取得し、コンピュータ全体を検索します。これらのファイルのいずれかが見つかった場合、ファイルは別のディレクトリに移動されます(実際に見つかったディレクトリから削除されます)。Dir.globがループ内の最後のファイルのみを評価するのはなぜですか?

検索はすべてのフォルダを一番下に移動する必要があります。私は「0001.txt」という名前のファイルを持っている上

 
0001.txt 
0002.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 

サンプル・ファイルlist.txtにファイルにこれらのエントリがあります。これまでのところ私は、次のコードを持っています。私はまた、 "0002.txt"という名前のファイルを含むsubdirという名前のフォルダにサブフォルダを持っています。私は、端末での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

関連する問題