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