grep 和 cp 对待“递归”是否相同?

grep 和 cp 对待“递归”是否相同?

grep与 相比,我在解释“递归”搜索的方式时遇到了麻烦cp。也许只是我使用它们的方式不同。

在这方面,grep似乎对“递归”的解释与 不同cp。那是对的吗? (我的问题)

根据我的问题在 SO 上浏览此内容...

对于包含 -matched 字符串的文件grep

./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“递归”的不同含义,或者它们是否将“递归”视为相同?有人可以帮助我理解不同的路径/文件参数是如何以相同的方式解释的cpgrep

答案1

你的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
    

    ...其中--将选项及其参数与非选项操作数分隔开。您的cp命令不存在该问题,因为通配模式保证扩展为以 string 开头的内容inc/

相关内容