2

1 日あたり約 50.000 個のテキスト ファイルをフォルダーに分類しています。たとえば、次のようになります。

/rootdir/20130831/ (containing 50000 files)
/rootdir/20130907/ (containing 50000 files)
/rootdir/20130908/ (containing 50000 files)
/rootdir/20130909/ (containing 50000 files)

ここで、find と grep を組み合わせた検索スクリプトを作成しました。検索コマンドは、ユーザーの入力に基づいて動的に作成されます。したがって、ユーザーが検索したい年しか知らない場合。検索は、すべての 2013 フォルダーに対して実行されます。

次に、ユーザーはいくつかの検索データも入力します。これは最大 3 つの検索文字列であり、次のような検索になります。

find /rootdir/2013*/ -type f | xargs grep -l searchstring1 | xargs grep -l searchstring2 | xargs grep -l searchstring3

もちろん、これには時間がかかります。検索ごとの時間を短縮できるかどうか疑問に思っていましたか? 時間がかからない方法はありますか?

* 編集 * find コマンドの結果を短縮するためにファイル名を使用できないことを忘れていました。

4

4 に答える 4

1

1 つのインタープリター言語で 1 つのプロセスを使用する方が高速です。そして、ここに Ruby 用のものがあります。

#!/usr/bin/env ruby

require 'find'

dir = ARGV.shift
year = ARGV.shift
patterns = ARGV.map{|a| Regexp.new(Regexp.quote(a)).freeze}

Dir.glob("#{dir}/#{year}**").each do |d|
  Find.find(d).drop(1).select{|f| File.file?(f)}.each do |f|
    text = File.read(f)
    match = true
    patterns.each do |p|
      unless p =~ text
        match = false
        break
      end
    end
    puts f if match
  end
end

使用例:

ruby script.rb /rootdir 2013 searchstring1 searchstring2 searchstring3
于 2013-09-10T03:11:46.603 に答える
0

最初に行うことは、最も限定的な文字列を最初に検索していることを確認することです。

「foo」が 10000 個のファイルにあり、「bar」が 100 個のファイルにある場合、処理が遅くなります。

# Find 10000 matching files, then search for bar in them.
find .... | xargs grep -l foo | xargs grep -l bar

それ以外の

# Find 100 matching files, then search for foo in them.
find .... | xargs grep -l bar | xargs grep -l foo
于 2013-09-09T15:09:29.727 に答える
0
find /rootdir/2013*/ -type f | xargs grep -l searchstring1 | xargs grep -l searchstring2 | xargs grep -l searchstring3

代わりに次のようにすると、少し速くなる可能性があります。

egrep -Rl 'searchstring1|searchstring2|searchstring3' /rootdir/2013*

また、特筆すべきは、

約 50.000 個のテキスト ファイルがフォルダーに分類されています

...ファイルシステムの最適な使用例ではない可能性があります。それらのいくつかは、多くのファイル、またはディレクトリごとの多くのファイルに対して、他のものよりも桁違いに優れています。さまざまなものをベンチマークすることを検討してください。

于 2013-09-09T18:06:19.857 に答える