linux下文件查找与文件内容查找

Linux 下文件查找主要使用 find 命令,而根据文件内容查找主要使用 grep 命令。

find

find 命令用来在指定目录下查找文件。 任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

选项

find 命令在 linux操作中详细介绍了。

例子

表示当前目录下查找文件名开头是字符串 'lib' 的文件

1
find . -name 'srm*'   

grep

使用了那么久的 grep 命令,就会一个 grep 'helloworld' ,竟然不知道可以利用 grep 来搜索文件内容。总结下 grep 的用法。

1
grep [OPTIONS] PATTERN [FILE...]

或者使用 正则表达式

1
grep [OPTIONS] [-e PATTERN]...  [-f FILE]...  [FILE...]

选项

-a 不要忽略二进制数据。
-A <显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
-b 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-c 计算符合范本样式的列数。
-C <显示列数>或-<显示列数>  除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d <进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e <范本样式> 指定字符串作为查找文件内容的范本样式。
-E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f <范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F 将范本样式视为固定字符串的列表。
-G 将范本样式视为普通的表示法来使用。
`-h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。`
-H 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i 忽略字符大小写的差别。
-l 列出文件内容符合指定的范本样式的文件名称。
-L 列出文件内容不符合指定的范本样式的文件名称。
-n 在显示符合范本样式的那一列之前,标示出该列的编号。
-q 不显示任何信息。
-R/-r 此参数的效果和指定“-d recurse”参数相同。
-s 不显示错误信息。
-v 反转查找。
-w 只显示全字符合的列。
-x 只显示全列符合的列。
-y 此参数效果跟 "-i" 相同。
-o 只输出文件中匹配到的部分。

pattern正则表达式主要参数:

\: 忽略正则表达式中特殊字符的原有含义。
^: 匹配正则表达式的开始行。
$:  匹配正则表达式的结束行。
\<: 从匹配正则表达 式的行开始。
\\>: 到匹配正则表达式的行结束。
[ ]: 单个字符,如[A]即A符合要求 。
[ - ]: 范围,如[A-Z],即A、B、C一直到Z都符合要求 。
**.** : 所有的单个字符。
\*  : 有字符,长度可以为0。

例子

显示/usr/src目录下的文件(不含子目录)包含magic的行

1
grep magic /usr/src  
显示/usr/src目录下的文件(包含子目录)包含magic的行
1
grep -r magic /usr/src  

只匹配整个单词,而不是字符串的一部分(如匹配 'magic',而不是 'magical' ),

1
grep -w pattern files 

只搜索 header 和 source 文件:

1
grep -inr --include \*.h --include \*.cpp ./Source

参考

[1] linux下的find文件查找命令与grep文件内容查找命令 [2] grep命令 [3] find命令 [4] How can I grep recursively, but only in files with certain extensions?