grep -R (大文字) と -r (小文字) の違い

grep -R (大文字) と -r (小文字) の違い

と入力する/etc/apache2/grep -rl 'LoadModule php' ./*のみが表示されます。に./mods-available/php7.0.load変更するとが表示されます。rR

./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.txt2.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(で呼び出されるとそれらが含まれますソース)。

からマニュアルページ ( man grep):

-r,--recursive 各ディレクトリの下にあるすべてのファイルを再帰的に読み取ります。コマンド ラインにある場合にのみシンボリック リンクをたどります。ファイル オペランドが指定されていない場合、grep は作業ディレクトリを検索することに注意してください。これは -d recurse オプションと同じです。

-R各ディレクトリの下にあるすべてのファイルを--dereference-recursive 再帰的に読み取ります。すべてのシンボリックリンクをたどります。とは異なり-r

関連情報