grep -R(大寫)和-r(小寫)之間的區別

grep -R(大寫)和-r(小寫)之間的區別

如果我進入/etc/apache2/並輸入,grep -rl 'LoadModule php' ./*那麼我只會看到./mods-available/php7.0.load.如果我改為r然後R我會看到

./mods-available/php7.0.load
./mods-enabled/php7.0.load

這兩個都是普通目錄。我希望-rgrep 遞歸 PWD 中的所有檔案/目錄。這是怎麼回事-r?我只想-R在這一點上一直使用。

答案1

根據grep 的線上說明頁

-r, --遞迴
               只有當符號連結位於命令列時,才以遞歸方式讀取每個目錄下的所有檔案。請注意,如果未給出檔案操作數,grep 將搜尋工作目錄。這相當於 -d 遞歸選項。

-R, --取消引用遞迴
               遞歸讀取每個目錄下的所有檔案。與 -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 grepv2.11-8以上版本,如果調用-r 排除符號連結未在命令列上指定,並在使用-R(調用時包含它們來源)。

手冊頁 ( man grep)

-r,--recursive 遞歸地讀取每個目錄下的所有文件,僅當符號連結位於命令行時才遵循它們。請注意,如果未給出檔案操作數,grep 將搜尋工作目錄。這相當於 -d 遞歸選項。

-R--dereference-recursive 遞歸讀取每個目錄下的所有檔案。遵循所有符號鏈接,不像-r

相關內容