linux查找包含指定字符串的文件

问题是想找到特定目录下(例如根目录)的所有包含特定文本的文件(搜索范围不包含文件名)。参考链接。经常使用linux的同学应该经常碰到这个问题,反正我的方法就是“grep 'text-to-find' /path -r”,这里有两个问题,一个是搜索结果如果包含超长字符串,展示就很不友好;第二个是目录大的话速度就有点慢。这两个不在本次讨论范围,回归正题。


最火爆的方法就是用grep:

grep -rnwl '/path/to/somewhere/' -e 'pattern'

其中参数-r或者-R表示递归搜索;-n是打印行号;-w表示匹配整个单词,如果单词中有检索子串略过,-l表示只打印文件名,不打印匹配内容,根据需要添加。

另外grep还有--exclude、--include、--exclude-dir选项可以用于更高效搜索。

如只想搜c文件或者头文件,可以这样用:

grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"

如不想搜.o文件,那么可以这样用:

grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"

如果想略过某些目录搜索,那么下面的指令可以略过dir1、dir2、以及所有以dst开头的文件:

grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"

感觉够了,更多选项请用man grep或者直接Google。

各种变体可以参考:

grep . -Ril -e 'texttoSearch' /etc/yum.repos.d

grep -lrnw '/root/Desktop/ipozal' -e 'geolocation'

还有awk版本:awk '/^(pattern)/{print}' /path/to/find/*,不过我没试过。


find方法也有,但是还要结合grep:

find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;

其中-type f表示正常文件,-exec表示找到文件后执行后面的命令,{}表示find的搜索出来的结果,\;收尾,不加会报错find: missing argument to `-exec'。

也可以指定文件类型:

find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;

各种变体可以参考:

find / -type f | xargs -d '\n' grep 'text-to-find-here'
find . -name "*.txt" | xargs -d '\n' grep -i "text_pattern"
find . -type f -name "*.*" -print0 | xargs -d '\n' --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"
alias ffind find / -type f | xargs -d '\n' grep
find . | xargs -d '\n' grep 'word' -sl


还可以用Silversearcher,sudo apt install silversearcher-ag,然后ag "text-to-find"。未实验。

桌面用户可以用Searchmonky。没用过。

各种陌生指令:

rg 'text-to-find-here' / -l
ag 'text-to-find-here' / -l
ack 'text-to-find-here' / -l
ack-grep "find my keyword"
pt -e 'text to search'
rg "class foo" .
14 views

©2020 by EasyCSTech. Special thanks to IPinfo​ and EasyNote.