web-dev-qa-db-ja.com

Linuxのファイルツリーでフレーズ/単語を再帰的に見つけるにはどうすればよいですか?

linuxのファイルツリーでフレーズ/単語を再帰的に見つけるにはどうすればよいですか?
find . -name ./* | grep my_phraseを試し、grep -r "register_long_arrays" *を試しました

grep -r "register_long_arrays" *

現在のディレクトリで出現するregister_long_arraysをすべて再帰的に検索します。

findgrepを組み合わせて検索するファイルの種類を制限する場合は、次のように使用する必要があります(この例では、検索を.txtで終わるファイルに制限します)。

find . -name '*.txt' -exec grep "register_long_arrays" {} \;

{}は、スペースなどの問題のある文字をエスケープすることを心配することなく、findが検出するすべてのファイルに置き換えられます。セミコロンの前の円記号に注意してください。これにより、findコマンドを終了するのではなく、セミコロンをエスケープしてexec句(grep)に渡すことができます。

それでも必要なものが見つからない場合は、ケースの問題である可能性があります(ケースを無視するには、grepに-iフラグを指定します)。または、必要なコンテンツが隠しファイル(.で始まる)にあり、*が一致しない可能性があります。 、この場合、grepへの引数として*.*の両方を指定します。

12
Ian Mackinnon
find . -type f -exec grep my_phrase {} \;

すべての通常のファイルを検索するように機能しますが、ファイルごとに1回grepを呼び出します。これは非効率的であり、低速のコンピュータや大きなディレクトリ階層では検索に著しく時間がかかります。そのため、xargsを使用することをお勧めします。

find . -type f | xargs grep my_phrase

または、名前にスペースが含まれているファイルがある場合は、

find . -type f -print0 | xargs -0 grep my_phrase

さらに簡単なのは、-rオプションをgrepに使用することです。

grep -r my_phrase .

の使用に注意してください。ファイル名の引数として*ではなく。これにより、隠しファイルを含まない*の展開の問題が回避されます。

3
garyjohn
find . -exec grep my_phrase {} \;

findは、現在のディレクトリ以下にあるすべてのファイルのリストを生成します。 execは、見つかったファイルごとにコマンドgrep my_phraseを実行します。 \;は、それを機能させるための魔法です。それがどのように機能するかの詳細は、通常、man findで見ることができます。

見つかったかどうかだけでなく、どこで見つかったかを知りたい場合は、grep-Hオプションも確認することをお勧めします。

0
hotei

試してください:

find . -name ./\* | xargs grep my_phrase

xargsは、findが検出した各ファイルでgrepを呼び出します。

0
Nathan Fellman

.bashrcファイルで、他のほとんどすべての回答の機能を提供する関数を定義します。

findgrep() {                                                                                                                
    if [[ $# == 1 ]]; then                                                                                                      
        find . -type f -exec grep -H "$1" '{}' \;                                                                           
    Elif [[ $# == 2 ]]; then                                                                                                    
        find $1 -type f -exec grep -H "$2" '{}' \;                                                                          
    Elif [[ $# == 3 ]]; then                                                                                                    
        find $1 -type f -name "$2" -exec grep -H "$3" '{}' \;                                                               
    else                                                                                                                        
        echo 'Usage:'                                                                                                           
        echo 'findgrep searchString'                                                                                            
        echo 'findgrep startDir searchString'                                                                                   
        echo 'findgrep startDir "fileNamePattern" searchString'                                                             
    fi                                                                                                                  
}

正規表現のみを指定することも、より多くの引数を使用して検索を制限することもできます。

  • ただの正規表現
  • 開始ディレクトリと正規表現
  • 開始ディレクトリ、ファイル名パターン、および正規表現
  • 引数を指定しないか、引数が多すぎると、ヘルプメッセージが出力されます。
0
John McGehee

ack を試すこともできます。これは速い。コードの木を扱う場合、それは素晴らしいツールです。

現在のディレクトリからファイルの内容でfoobarを再帰的に検索します。

ack foobar

名前が正規表現に一致するファイルの検索:

ack -g "foo(bar)?"
0
sickill