Grep

grep 和 cp 是否同樣對待“遞歸”?

  • May 15, 2022

與. grep_ cp也許只是我使用它們的方式不同。

在此,grep似乎對“遞歸”的解釋與cp. 那是對的嗎?(我的問題)

根據我的問題,在 SO 上瀏覽這個…

使用包含grep-matched 字元串的文件:

./file1.js
./file2.php
./inc/file3.js
./inc/file4.php
./inc.php/file5.php
grep -R "find me" *.php

回報:

./file2.php
./inc.php/file5.php

…因為grep想要匹配包含“.php”的目錄和文件

但是,如果我使用cp遞歸複製,說:

cp -r inc/* ~/mywork/

將複製“inc”文件夾中的文件以及所有目錄等,儘管不是隱藏文件,無論它們的名稱中是否包含“inc”。

grep“遞歸”的cp含義是否不同,或者他們是否將“遞歸”視為相同?有人可以幫助我了解如何以相同的方式解釋不同cp的路徑/文件參數嗎?grep

你的grep命令,

grep -R "find me" *.php

… 包含文件名通配模式,*.php. 這將在 shell 執行之前由 shell 擴展grep,因此執行時的實際命令可能類似於

grep -R "find me" file1.php file2.php inc.php

…其中inc.php恰好是目錄名稱。

然後,該grep實用程序將在給定文件中搜尋您提供的表達式。對於命令行中提到的目錄,它將在目錄下的所有文件和子目錄中搜尋內容與表達式匹配的文件。inc.php/subdir/README這意味著如果該文件包含字元串,您將找到匹配項find me

簡而言之:根據給定的選項(遞歸地)處理(在其中搜尋匹配的行)命令行上給出的每個名稱。

cp命令在遞歸操作方面的工作方式相同:

cp -r inc/* ~/mywork/

shell會將上述命令擴展為類似

cp -r inc/file1 inc/file2 inc/dir1 inc/dir2 /home/myself/mywork/

然後,該cp實用程序將針對每個單獨命名的文件或目錄,將該文件或目錄遞歸地複製到目標目錄。

簡而言之:根據給定的選項(遞歸地)處理(複製到目的地)命令行上給出的每個名稱。


補充說明:

  • 對遞歸搜尋的支持grep是一個非標準擴展。
  • 應該小心處理可能擴展為以破折號開頭的名稱的文件名通配模式,以免與命令行選項混淆。因此,您的grep命令更安全地寫成
grep -R -- "find me" *.php

或作為

grep -R -e "find me" -- *.php

… where--將選項及其參數與非選項操作數分隔開來。您的cp命令沒有這個問題,因為通配模式保證會擴展到以 string 開頭的內容inc/

引用自:https://unix.stackexchange.com/questions/702578