如何找出当前目录中不包含单词foo(使用grep)的文件?
当前回答
为了完整,ripgrep版本如下:
rg --files-without-match "pattern"
你可以结合文件类型和搜索路径,例如:
rg --files-without-match -t ruby "frozen_string_literal: true" app/
其他回答
我的grep没有任何-L选项。我确实找到了解决办法。
这些想法是:
将包含相应字符串的所有文件名转储到txt1.txt。 将目录中的所有文件名转储到txt2.txt文件中。 使用diff命令区分2个转储文件。 Grep 'foo' *.log | cut -c1-14 | uniq > txt1.txt Grep * *.log | cut -c1-14 | uniq > txt2.txt Diff txt1.txt txt2.txt | grep ">"
问题
我需要重构一个使用.phtml文件编写HTML使用内联PHP代码的大型项目。我想用胡子模板代替。我想找到任何。phtml贾尔斯不包含字符串新的胡子,因为这些仍然需要重写。
解决方案
找到。- iname”*。phtml' -exec grep -H -E -o -c '新胡子' {}\;| grep:0$ | sed 's/..$//'
解释
在管道之前:
Find
找到。递归地查找文件,从这个目录开始
- iname”*。文件名必须包含.phtml (i使其不区分大小写)
-exec 'grep -H -E -o -c 'new Mustache'{}'在每个匹配的路径上执行grep命令
Grep
始终用输出行打印文件名标题。
将pattern解释为扩展的正则表达式(即force grep 表现得像egrep)。
-o只打印匹配的行。
-c只将选定的行数写入标准输出。
这将给我一个以.phtml结尾的所有文件路径的列表,并计算字符串new Mustache在每个路径中出现的次数。
$> find . -iname '*.phtml$' -exec 'grep -H -E -o -c 'new Mustache' {}'\;
./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml:0
./app/MyApp/Customer/View/Account/studio.phtml:0
./app/MyApp/Customer/View/Account/orders.phtml:1
./app/MyApp/Customer/View/Account/banking.phtml:1
./app/MyApp/Customer/View/Account/applycomplete.phtml:1
./app/MyApp/Customer/View/Account/catalogue.phtml:1
./app/MyApp/Customer/View/Account/classadd.phtml:0
./app/MyApp/Customer/View/Account/orders-trade.phtml:0
第一个管道grep:0$将该列表过滤为只包含以:0结尾的行:
$> find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$
./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml:0
./app/MyApp/Customer/View/Account/studio.phtml:0
./app/MyApp/Customer/View/Account/classadd.phtml:0
./app/MyApp/Customer/View/Account/orders-trade.phtml:0
第二条管道sed 's/..$//'去掉每行的最后两个字符,只留下文件路径。
$> find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'
./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml
./app/MyApp/Customer/View/Account/studio.phtml
./app/MyApp/Customer/View/Account/classadd.phtml
./app/MyApp/Customer/View/Account/orders-trade.phtml
如果你正在使用git,它会搜索所有被跟踪的文件:
git grep -L "foo"
如果你打开了**子目录globbing,你可以在跟踪文件的子集中搜索(在.bashrc中使用shopt -s globstar):
git grep -L "foo" -- **/*.cpp
来看看ack。它自动为您排除.svn,为您提供Perl正则表达式,并且是一个简单的Perl程序下载。
在ack中,与你要找的内容等价:
ack -L foo
你实际上需要:
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep :0\$
推荐文章
- 如何在Android工作室添加“libs”文件夹?
- 在Python中提取文件路径(目录)的一部分
- Crontab -在目录中运行
- 如何将字典保存到文件?
- 如何上传文件与python请求?
- 如何在bash脚本中检查文件名的扩展名?
- Windows递归grep命令行
- 如何可靠地打开与当前运行脚本在同一目录下的文件
- 我怎么能得到'查找'忽略。svn目录?
- 将列表的Python列表写入csv文件
- Visual Studio单击“查找结果”在错误的窗口中打开代码
- 如何使用Bash创建一个文件夹,如果它还不存在?
- 不能与文件列表一起使用forEach
- python方式检查文件是否存在?
- BAT文件执行后保持CMD打开