と入力する/etc/apache2/
とgrep -rl 'LoadModule php' ./*
のみが表示されます。に./mods-available/php7.0.load
変更するとが表示されます。r
R
./mods-available/php7.0.load
./mods-enabled/php7.0.load
-r
これらは両方とも単純なディレクトリです。grepが PWD 内のすべてのファイル/ディレクトリを再帰的に検索することを期待します。 はどうなっているのでしょうか?現時点では-r
常に を使用するつもりです。-R
答え1
によるとgrep のマニュアルページ:
-r, --再帰
各ディレクトリの下にあるすべてのファイルを再帰的に読み取ります。シンボリック リンクは、コマンド ラインにある場合にのみ従います。ファイル オペランドが指定されていない場合、grep は作業ディレクトリを検索することに注意してください。これは、-d recurse オプションと同じです。-R, --dereference-recursive
各ディレクトリの下にあるすべてのファイルを再帰的に読み取ります。-r とは異なり、すべてのシンボリック リンクをたどります。
例:
フォルダがありますテストファイルがある1.txt。2.txtはシンボリックリンクです1.txtの出力は次ls -l test
のようになります。
-rw-r--r-- 1 kulfy kulfy 15 Jun 12 21:53 1.txt
lrwxrwxrwx 1 kulfy kulfy 5 Jun 12 21:53 2.txt -> 1.txt
の内容1.txtは:
This is a file.
検索したい場合"ファイル"ファイル内の文字列テストフォルダーを作成し、次を実行します:
grep "file" test
エラーが発生します:
grep: test: Is a directory
しかし、もし私がそうするなら:
grep -R "file" test
出力は次のようになります:
test/2.txt:This is a file
test/1.txt:This is a file
一方、以下を実行すると:
grep -r "file" test
出力は次のようになります:
test/1.txt:This is a file
ここでは、すべてのファイルをスキャンすることを明示的には述べていません。そのため、R
フラグを使用すると、シンボリックリンク(ここでは2.txt) が尊重され、出力が生成されました。しかし、r
フラグを使用した場合、スキャンするように指定しなかったため、シンボリックリンクは無視されました。2.txtまた。
答え2
GNU grepよりv2.11-8以上、呼び出された場合-r
シンボリックリンクを除外するコマンドラインでは指定されず、-R
(で呼び出されるとそれらが含まれますソース)。
-r
,--recursive
各ディレクトリの下にあるすべてのファイルを再帰的に読み取ります。コマンド ラインにある場合にのみシンボリック リンクをたどります。ファイル オペランドが指定されていない場合、grep は作業ディレクトリを検索することに注意してください。これは -d recurse オプションと同じです。
-R
各ディレクトリの下にあるすべてのファイルを--dereference-recursive
再帰的に読み取ります。すべてのシンボリックリンクをたどります。とは異なり-r
。