善用 grep 去寻找
如何使用 grep 去寻找含有特定字符串的所有文件? 这是文字工作者日常工作时常执行的任务。
回答是用 -r 参数(取recursive 的首字母)。
极简使用示例:grep -r 'recommend' .
其中, 'recommend' 是我需要搜索的词, 最后的一个点号(.)不要忘了,代表我要搜索的地方是当前的目录以及所有的子目录。
该命令的几种有趣变形
想要显示匹配的行号。 grep -rn 'recommend' . 在 -r 后面添加 n 选项。
嫌输出太多,我只要文件名及其路径。 grep -rl 'recommend' . 在 -r 后面添加 l 选项。
只要匹配源代码,不需要匹配二进制文件(比如 pyc 文件)。 grep -ra 'recommend' . 在 -r 后面添加 a 选项。
只需要匹配 recommend, 不需要匹配 recommended。 grep -rw 'recommend' . 在 -r 后面添加 w 选项。
排除隐藏文件夹,比如 .git。 grep -r --exclude-dir="\.git" 'recommend' . 添加 --exclude-dir 选项。 "\.git" 表示不去匹配名字为 .git 的文件夹。 排除特定的文件也可以,就是把 --exclude-dir 改为 --exclude, 去掉 -dir。排除后,输出结果的速度可以提升数倍。
不排除任何文件夹,0.407 秒。
$ time grep -rl 'recommend' .
./.gitignore
./main.py
./services/services.py
./services/__pycache__/services.cpython-38.pyc
./services/__pycache__/services.cpython-311.pyc
grep -rl 'recommend' . 0.37s user 0.03s system 99% cpu 0.407 total
排除 .git 文件夹, 0.119 秒。
$ time grep -rl --exclude-dir="\.git" 'recommend' .
./.gitignore
./main.py
./services/services.py
./services/__pycache__/services.cpython-38.pyc
./services/__pycache__/services.cpython-311.pyc
grep -rl --exclude-dir="\.git" 'recommend' . 0.11s user 0.01s system 98% cpu 0.119 total
同时排除 .git 文件夹与 __pycache__ 文件夹, 0.104 秒。
$ time grep -rl --exclude-dir="\.git" --exclude-dir="__pycache__" 'recommend' .
./.gitignore
./main.py
./services/services.py
grep -rl --exclude-dir="\.git" --exclude-dir="__pycache__" 'recommend' . 0.09s user 0.01s system 97% cpu 0.104 total
总结
grep 有诸多选项,可以提升我们的搜索效率。比如,rawnl, exclude。