linuxのファイルツリーでフレーズ/単語を再帰的に見つけるにはどうすればよいですか?find . -name ./* | grep my_phrase
を試し、grep -r "register_long_arrays" *
を試しました
grep -r "register_long_arrays" *
現在のディレクトリで出現するregister_long_arrays
をすべて再帰的に検索します。
find
とgrep
を組み合わせて検索するファイルの種類を制限する場合は、次のように使用する必要があります(この例では、検索を.txt
で終わるファイルに制限します)。
find . -name '*.txt' -exec grep "register_long_arrays" {} \;
{}
は、スペースなどの問題のある文字をエスケープすることを心配することなく、find
が検出するすべてのファイルに置き換えられます。セミコロンの前の円記号に注意してください。これにより、findコマンドを終了するのではなく、セミコロンをエスケープしてexec句(grep)に渡すことができます。
それでも必要なものが見つからない場合は、ケースの問題である可能性があります(ケースを無視するには、grepに-i
フラグを指定します)。または、必要なコンテンツが隠しファイル(.
で始まる)にあり、*
が一致しない可能性があります。 、この場合、grepへの引数として*
と.*
の両方を指定します。
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 .
の使用に注意してください。ファイル名の引数として*ではなく。これにより、隠しファイルを含まない*の展開の問題が回避されます。
find . -exec grep my_phrase {} \;
find
は、現在のディレクトリ以下にあるすべてのファイルのリストを生成します。 exec
は、見つかったファイルごとにコマンドgrep my_phrase
を実行します。 \;
は、それを機能させるための魔法です。それがどのように機能するかの詳細は、通常、man find
で見ることができます。
見つかったかどうかだけでなく、どこで見つかったかを知りたい場合は、grep
の-H
オプションも確認することをお勧めします。
試してください:
find . -name ./\* | xargs grep my_phrase
xargs
は、find
が検出した各ファイルでgrepを呼び出します。
.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
}
正規表現のみを指定することも、より多くの引数を使用して検索を制限することもできます。
ack を試すこともできます。これは速い。コードの木を扱う場合、それは素晴らしいツールです。
現在のディレクトリからファイルの内容でfoobarを再帰的に検索します。
ack foobar
名前が正規表現に一致するファイルの検索:
ack -g "foo(bar)?"