find(精准递归搜索)find是Linux中最强大的文件搜索工具,通过遍历文件系统实现精准查找,支持按名称、类型、大小、时间、权限等多条件组合。
基本语法:find [搜索路径] [条件] [动作](默认搜索当前目录及子目录,动作默认为-print输出结果)。
常用示例:
find /home -name "*.log"(在/home目录下查找所有.log后缀的文件,区分大小写);find /var -iname "error*"(在/var目录下查找以error开头的文件,忽略大小写);find /etc -type d -name "nginx"(在/etc目录下查找名为nginx的目录,-type d表示目录,-type f表示普通文件);find /tmp -size +100M(在/tmp目录下查找大于100MB的文件,+表示大于,-表示小于,单位支持k(KB)、M(MB)、G(GB));find /home -mtime -7(在/home目录下查找7天内修改过的文件,-mtime -n表示n天内修改,-mtime +n表示n天前修改);find . \( -name "*.txt" -o -name "*.md" \)(在当前目录下查找.txt或.md文件,-o表示“或”,-a表示“与”,括号需用\转义);find /tmp -name "*.tmp" -delete(删除/tmp目录下所有.tmp文件,谨慎使用;-exec command {} \;可将匹配文件传递给其他命令,如find . -type f -exec chmod 644 {} \;批量修改权限)。locate(快速数据库检索)locate通过预建的文件数据库(mlocate.db)实现快速查找,速度远快于find,但不支持实时更新(需手动或定时更新数据库)。
基本语法:locate [选项] [搜索模式]。
常用示例:
locate nginx.conf(查找所有包含nginx.conf的文件路径);locate -i "*.jpg"(查找所有.jpg或.JPG等格式的文件);locate "*.log"(查找所有.log后缀的文件);locate -r "\.conf$"(查找所有以.conf结尾的文件,-r表示使用正则表达式)。sudo updatedb(强制刷新数据库,使新文件或删除文件能及时反映到搜索结果中);crontab -e修改/etc/crontab调整更新频率,如每小时更新一次:5 * * * * root updatedb)。/tmp默认不索引,需修改/etc/updatedb.conf中的PRUNEPATHS参数)、不支持按文件大小/时间等条件过滤。grep(文本模式匹配)grep用于在文件内容中搜索指定的字符串或正则表达式,支持递归搜索目录,是运维和开发中常用的文本分析工具。
基本语法:grep [选项] "搜索模式" [文件...](若未指定文件,则从标准输入读取数据,如cat file.txt | grep "pattern")。
常用示例:
grep "error" /var/log/syslog(在/var/log/syslog文件中查找包含error的行);grep -i "warning" file.txt(查找file.txt中不区分大小写的warning行);grep -r "404" /var/www/(在/var/www/目录下递归查找所有包含404的文件);grep -n "GET /api" access.log(显示匹配行的行号,便于定位);grep --color=auto "pattern" file(用颜色高亮匹配的文本,提升可读性);grep -v "debug" log.txt(显示不包含debug的行,过滤无关信息);grep -c "timeout" error.log(统计error.log中包含timeout的行数);grep -A 2 -B 1 "error" syslog(显示匹配行及后面2行、前面1行,便于查看上下文)。-E选项支持扩展正则表达式(ERE),如grep -E "error|fail" log.txt(查找包含error或fail的行),更灵活地匹配复杂模式。which/whereis/type这三个命令用于查找命令的可执行文件路径、源码或帮助文档,适用于快速定位命令的安装位置。
which:查找命令的可执行文件路径基本语法:which [命令名](仅搜索$PATH环境变量中的目录)。
示例:which ls(输出/bin/ls,显示ls命令的可执行文件路径);which python3(输出python3的安装路径,如/usr/bin/python3)。
whereis:查找命令的二进制、源码和帮助文档基本语法:whereis [命令名](快速查找命令的相关文件,如二进制文件、源码、man手册)。
示例:whereis python3(输出python3的二进制路径、源码路径和man手册路径,如/usr/bin/python3 /usr/lib/python3.10 /usr/share/man/man1/python3.1.gz)。
type:判断命令类型(内置/别名/外部命令)基本语法:type [命令名](显示命令的类型,帮助区分内置命令(如cd)、别名(如ll)或外部命令(如ls))。
示例:type cd(输出cd is a shell builtin,表示cd是Shell内置命令);type ll(输出ll is aliased to 'ls -alF',表示ll是ls -alF的别名)。
ack/ag(The Silver Searcher):高性能代码搜索ack和ag是专为代码搜索设计的工具,比grep更快,支持忽略版本控制目录(如.git)、自动递归搜索、高亮显示等功能。
安装:sudo apt-get install ack(Debian/Ubuntu);sudo yum install ack(Red Hat/CentOS);ag同理。
示例:ack "function" /path/to/code(在/path/to/code目录下查找包含function的代码行,自动忽略.git等目录);ag -i "TODO" src/(忽略大小写查找src/目录下的TODO注释)。
find /path -type f -name "*.tmp" -exec rm {} \;(删除/path目录下所有.tmp文件);find src/ -name "*.py" | xargs wc -l(统计src/目录下所有.py文件的代码行数)。which ls(显示ls命令路径);whereis python3(显示python3的相关文件路径)。grep -rn "error" /var/log/ | grep -v "debug"(递归搜索/var/log/目录下的error行,并过滤掉包含debug的行)。