find 和 grep 命令

📅 发布时间:2026/7/3 13:01:32 👁️ 浏览次数:
find 和 grep 命令
目录一、find —— 查找文件1. 基本概念2. 命令格式3. 常用查找方式3.1 按文件名查找-name示例 1精确查找文件示例 2使用通配符查找示例 3查找目录或文件示例 4默认当前路径3.2 按文件大小查找-size3.3 按修改时间查找-mtime示例3.4 按文件类型查找-type示例3.5 组合条件查找示例4. 对找到的文件执行操作-exec示例删除所有 .tmp 文件二、grep —— 查找文件内容1. 基本概念2. 命令格式3. 常用选项4. 基本用法示例示例 1在单个文件中查找示例 2递归查找所有文件示例 3忽略大小写示例 4全字匹配示例 5显示不包含匹配模式的行5. 结合管道使用示例 1查看历史命令中包含 find 的示例 2在 grep 的结果中再次搜索链式过滤示例 3统计匹配行数6. 常用正则表达式元字符扩展示例三、find 与 grep 的对比总结示例查找所有 .c 文件中包含 main 的行在 Linux 系统中随着使用时间的增长文件会越来越多。当我们需要快速定位某个文件或者在海量代码中查找某个特定的字符串时就需要用到查找命令。本节将详细介绍两个最常用的查找命令find查找文件和grep查找文件内容。一、find —— 查找文件1. 基本概念find命令用于在指定目录下查找符合条件的文件或目录。它的工作方式类似于 Windows 中的文件搜索但功能更强大、更灵活。2. 命令格式bash find [查找路径] [选项] [查找条件]查找路径告诉find从哪个目录开始搜索。如果不指定默认为当前目录.。选项指定按照什么方式查找例如按文件名、按文件大小、按修改时间等。查找条件具体的查找内容比如文件名、大小值等。3. 常用查找方式3.1 按文件名查找-name这是最常用的方式。使用-name选项后面跟要查找的文件名可以使用通配符*、?等。示例 1精确查找文件bash $ find /home/book/dira/ -name test1.txt说明在/home/book/dira/目录下查找名为test1.txt的文件。如果找到会输出该文件的完整路径如果没找到则没有任何输出也不会报错。示例 2使用通配符查找bash $ find /home/book/dira/ -name *.txt说明查找/home/book/dira/目录下所有以.txt结尾的文件。*代表任意长度的任意字符。示例 3查找目录或文件bash $ find /home/book/dira/ -name dira说明查找名为dira的文件或目录。注意如果dira是一个目录它也会被列出。示例 4默认当前路径bash $ find -name *.txt # 相当于 find . -name *.txt说明如果不指定路径find默认从当前目录开始查找。.代表当前目录。3.2 按文件大小查找-sizebash $ find /home/book -size 10M # 查找大于 10MB 的文件 $ find /home/book -size -1k # 查找小于 1KB 的文件说明表示大于-表示小于。单位c字节、kKB、MMB、GGB。3.3 按修改时间查找-mtime-mtime n查找 n 天前当天修改过的文件。-mtime n查找 n 天之前修改过的文件不包括 n 天当天。-mtime -n查找 n 天之内修改过的文件包括 n 天当天。示例bash $ find /home/book -mtime -2 # 查找 /home/book 下两天内有变动的文件 $ find /home/book -mtime 7 # 查找 /home/book 下超过 7 天未修改的文件类似选项还有-amin n按访问时间分钟-cmin n按状态改变时间分钟-mmin n按修改时间分钟3.4 按文件类型查找-type-type f普通文件-type d目录-type l符号链接示例bash $ find /home/book -type d -name project # 查找名为 project 的目录3.5 组合条件查找可以使用逻辑运算符组合多个条件-a或-and与默认-o或-or或!或-not非示例bash $ find /home/book -name *.c -o -name *.h # 查找所有 .c 或 .h 文件 $ find /home/book ! -name *.txt # 查找所有不以 .txt 结尾的文件4. 对找到的文件执行操作-execfind的强大之处在于可以对找到的文件执行后续命令。格式为bash find ... -exec 命令 {} \;{}代表找到的文件名\;表示命令结束必须转义分号示例删除所有 .tmp 文件bash $ find /home/book -name *.tmp -exec rm {} \;二、grep —— 查找文件内容1. 基本概念grep是一个强大的文本搜索工具它可以在一个或多个文件中查找包含指定字符串的行并打印出来。它支持正则表达式可以进行非常复杂的模式匹配。2. 命令格式bash grep [选项] [查找模式] [文件名...]查找模式要搜索的字符串或正则表达式。文件名要搜索的目标文件。可以使用通配符如*表示当前目录下的所有文件。3. 常用选项选项含义-r或-R递归搜索子目录-n显示匹配行的行号-i忽略大小写-w全字匹配只匹配整个单词而不是单词的一部分-v反向选择显示不包含匹配模式的行-c只显示匹配的行数-l只显示包含匹配内容的文件名不显示具体行-H显示文件名默认在搜索多个文件时显示--color高亮显示匹配的字符串很多系统默认已设置别名4. 基本用法示例假设我们在~/test目录下有两个文件test1.txt内容text aaa AAAAAA abc abcabcabc cbacbacba match_pattern nand-erasetest2.txt内容text bbb ABC hello world示例 1在单个文件中查找bash $ grep -n abc test1.txt 3:abc 4:abcabcabc-n显示行号输出格式为行号:内容。这里找到第 3 行和第 4 行包含abc。示例 2递归查找所有文件bash $ grep -rn abc * test1.txt:3:abc test1.txt:4:abcabcabc-r递归查找当前目录包括子目录下的所有文件。输出会显示文件名、行号和内容。示例 3忽略大小写bash $ grep -rni abc * test1.txt:3:abc test1.txt:4:abcabcabc test2.txt:2:ABC加上-i后ABC也被匹配到了。示例 4全字匹配bash $ grep -rnw abc * test1.txt:3:abc-w要求匹配整个单词所以abcabcabc不被匹配因为它不是独立的单词被其他字符包围。示例 5显示不包含匹配模式的行bash $ grep -v abc test1.txt aaa AAAAAA cbacbacba match_pattern nand-erase显示所有不包含abc的行。5. 结合管道使用grep经常与管道|结合使用用于过滤其他命令的输出。示例 1查看历史命令中包含 find 的bash $ history | grep find示例 2在grep的结果中再次搜索链式过滤bash $ grep -rn ABC * | grep \.h第一个grep查找所有包含ABC的行递归、显示行号。管道将结果传给第二个grep第二个grep再从中筛选出包含.h的行注意.需要转义表示字面点号。这个命令常用于查找包含某个宏或函数定义的头文件。示例 3统计匹配行数bash $ grep -rc abc * # 显示每个文件中匹配的行数 test1.txt:2 test2.txt:06. 常用正则表达式元字符扩展grep默认使用基本正则表达式如果使用-E选项则启用扩展正则表达式功能更强。常见元字符.匹配任意单个字符*匹配前一个字符零次或多次^匹配行首$匹配行尾[abc]匹配 a、b、c 中的任意一个[^abc]匹配除 a、b、c 外的任意字符\{n\}匹配前一个字符恰好 n 次基本正则需转义大括号示例bash $ grep ^abc test1.txt # 查找以 abc 开头的行 $ grep abc$ test1.txt # 查找以 abc 结尾的行 $ grep -E abc{2} test1.txt # 查找 abcc使用 -E 启用扩展正则三、find 与 grep 的对比总结命令功能常用场景find查找文件或目录需要根据文件名、大小、时间等属性定位文件时使用grep查找文件中的内容需要搜索文件内部是否包含特定字符串时使用二者经常结合使用先用find找到需要的文件再用grep在这些文件中搜索内容。示例查找所有.c文件中包含main的行bash $ find . -name *.c -exec grep -n main {} \;或者使用xargsbash $ find . -name *.c | xargs grep -n main