博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Unix]grep工具的-R选项不起作用?
阅读量:6604 次
发布时间:2019-06-24

本文共 834 字,大约阅读时间需要 2 分钟。

想在当前目录及子目录的.cpp文件中搜索关键字char,键入:

grep -R char *.cpp

失败。

找了很久原因,发现这样一个事实:

-R选项的确会进入子目录递归匹配,但前提是,子目录名称也必须满足*.cpp的命名规则,也就是说,对于如下目录层次应用上面的命令:

./1.cpp

./2.cpp

./dir.cpp/3.cpp

./dir/4.cpp

其中./dir/4.cpp由于目录名称不满足*.cpp的命名规则,4.cpp这个文件是不会参与匹配的...

 

正确的方案得引入管道:

find -type f -name *.cpp | xargs grep char

 

由于我自己的应用场合不太适合管道,最终降低要求,改为匹配包括.cpp在内的所有文件:

grep -R char *

 

另外,grep的行为不符合我这个Windows程序员直觉的地方其实有两点(不同于Windows下findstr /S char *.cpp):

1. 开启-R后,只有顶层子目录名满足规则才会深入该目录递归。针对我文章开头的命令,文件./cpp/1.cpp的内容会进行匹配,而文件./dir/2.cpp不会进行匹配。

2. 开启-R后,一旦顶层子目录名满足规则,则其下的各级更深层次的子文件不再受命名规则限制,直接进入内容匹配的环节。即./cpp/1.txt和./cpp/dir/2.txt的内容都会进行匹配。

 

总结:

grep -R char *.cpp中的命名规则*.cpp,是用来约束顶层子目录和子文件的,通过过滤的顶层子目录,其下所有更深层的子文件均算通过名称过滤。

相对的,Windows下findstr /S char *.cpp,其中的*.cpp是用来约束所有深度子文件名的,而各级子目录无条件遍历(个人觉得这种行为更自然)。

转载于:https://www.cnblogs.com/cbscan/archive/2011/11/28/2266687.html

你可能感兴趣的文章
Have a Good Attitude 良好的态度
查看>>
win7 web开发遇到的问题-由于权限不足而无法读取配置文件,无法访问请求的页面...
查看>>
vs2012中自带IIS如何让其他电脑访问
查看>>
谁(何时)需要设置监听器(回调)
查看>>
关于termux在手机上搭载Linux系统,python,ssh
查看>>
Redux:异步操作
查看>>
Mysql学习第三课-分析二进制日志进行增量备份和还原
查看>>
2-11
查看>>
关于C#调用广州医保HG_Interface.dll调用的一些总结(外部组件异常)
查看>>
N2CMS——Bugs解决方案总结
查看>>
Appium IOS
查看>>
xhprof安装记录
查看>>
POJ1961 Period [KMP应用]
查看>>
CSS hack
查看>>
Spring+Mybatis 多数据源配置
查看>>
IT项目管理工具探讨之_项目群管理
查看>>
如何在 Android 手机上安装 Ubuntu 13.04
查看>>
HDU 6073 - Matching In Multiplication | 2017 Multi-University Training Contest 4
查看>>
编程面试过程中常见的10大算法(转)
查看>>
尝试记录自己的工作学习
查看>>