我喜欢unix的find
命令,但当我想在项目中搜索任意文件夹或子文件夹中的文本时,我总是觉得它太过繁琐。
有没有更简单的方法?
我喜欢unix的find
命令,但当我想在项目中搜索任意文件夹或子文件夹中的文本时,我总是觉得它太过繁琐。
有没有更简单的方法?
尝试使用 grep
工具:
使用:grep -rl alvin .
你的递归 grep
搜索不必限于当前目录。下一个示例展示了如何递归地在两个不相关的目录中搜索大小写不敏感的字符串 "alvin":
grep -ril alvin /home/cato /htdocs/zenf
您还可以使用egrep
命令执行递归搜索,它允许您一次搜索多个模式。
egrep -ril 'aja|alvin' .
请注意,在此情况下,需要在搜索模式周围加上引号。
概述: grep -r notes:
关于 grep -r
命令的一些说明:
如果不使用 -l(小写的“L”)标志,这个grep命令没有多大意义。该标志告诉grep打印匹配的文件名。
不要忘记在grep命令的末尾列出一个或多个目录。如果忘记添加任何目录,grep将尝试从标准输入读取(与往常一样)。
如所示,您还可以使用其他正常的grep标志,包括-i以忽略大小写,-v以颠倒搜索的含义等。
git grep
是一种方法,但它会忽略未跟踪的文件(所以它不完全等同于您使用 find
的任何操作)。还有其他一些方法可以避免 find
奇怪的语法来实现这一点:
grep -r "<string>" /path/to/repo
你也可以尝试我的个人最爱 grep
替代品,ack, 在我的亲身经历中,它的表现优于 grep
和 git grep
:
ack "<string>" /path/to/repo ;# path is unnecessary if you're already in the repo
Grep是最简单的方法。
grep -r 'text to find' .
git grep
"你的文本字符串",从应用程序的基目录开始是一个很好的方法。
正如克里斯托弗所指出的那样,ack
也非常有用。
他的安装方法对我没有起作用。我不得不执行以下操作:
sudo apt-get install ack-grep
然后为了方便起见
alias ack='ack-grep ' # So that I can just type ack "string"
我还会将其添加到我的~/.bash_aliases
文件中。
What's so great about Ag?
- It is an order of magnitude faster than ack.
- It ignores file patterns from your .gitignore and .hgignore.
- If there are files in your source repo you don't want to search, just add their patterns to a .ignore file. (cough *.min.js cough)
- The command name is 33% shorter than ack, and all keys are on the home row!
Ag is quite stable now. Most changes are new features, minor bug fixes, or performance improvements. It's much faster than Ack in my benchmarks:
ack test_blah ~/code/ 104.66s user 4.82s system 99% cpu 1:50.03 total ag test_blah ~/code/ 4.67s user 4.58s system 286% cpu 3.227 total
Ack and Ag found the same results, but Ag was 34x faster (3.2 seconds vs 110 seconds). My ~/code directory is about 8GB. Thanks to git/hg/ignore, Ag only searched 700MB of that.
它可以通过大多数软件包仓库进行安装,例如:
apt-get install silversearcher-ag
curl
直接安装到了~/bin/ack
。 - Christopher