文件查找和搜索是常用操作,本文总结Linux文件查找的方法,并简要说明各个查找命令的异同。
which
which
命令 查找可执行文件的完整路径。 注意其查找对象为用户当前会话可用的可执行命令,即范围仅限于 $PATH 变量包含的文件夹,以及用户自定义的别名。如果某个命令路径不在当前会话的$PATH变量中,which
不会全局搜索去查找。
命令使用示例:
which nisdomainname // 查找nisdomainname的完整路径,正常输出 /bin/nisdomainname
which gcc // 查找gcc的完整路径, 可能的输出为 /usr/bin/gcc
which la // la是自定义的别名,可能的输出为 alias la='ls -A' /bin/ls
which me // me命令未定义,可能的输出为 /usr/bin/which: no me in (路径字符串)
find
find
命令查找符合条件的指定文件,用法为:
find [路径] [选项] [操作]
常用选项有:
-(i)name: 根据名字匹配,可以使用*等匹配符 -maxdepth: 定义查找深度 -user|group: 根据文件属主|用户组查找文件 -type: 根据文件类型过滤文件(d:目录,l:符号链接,f:普通文件) -mtime: 根据文件变动时间修改, -n表示距离今天n天之内改变的文件,+n表示在n天之前改动的文件
常用操作八廓:
-print: 将匹配结果输出到标准输出(默认) -exec: 对匹配的文件执行shell命令,格式为: command {} \;,其中{}个 \之间必须有空格 -ok: 与-exec类似,不过执行前需确认
使用示例:
find . -name *.cpp // 查找当前目录下的所有c++源文件
find . -mtime -5 -name *.cpp // 查找5天内改动的c++源文件
find . -user tlanyan -name *.cpp // 查找属主为tlanyan的c++源文件
find /var/www -maxdepth 2 -name *.php -exec php {} \; // 查找/var/www下二级目录内的php文件并执行
find
除了常与 -exec 参数结合,另一个最佳搭档是配合管道的 xargs
。例如删除过期日志:
find /var/log/nginx -mtime +15 | xargs rm -rf
whereis
whereis
命令用于定位 某个命令的可执行文件、源文件或者文档的位置,其which命令类似,查找对象是可执行命令。
用法:
whereis [选项] [路径] 文件名
常用选项有:
-b: 只查找可执行文件 -m: 只查找文档 -s: 只查找源代码
路径选项相应为:
-B: 限定查找可执行文件的路径,-M, -S同理
使用示例:
whereis gcc
# 输出: /usr/bin/gcc /usr/lib/gcc /usr/libexec/gcc /usr/share/man/man1/gcc.1.gz
whereis -b gcc
# 输出: /usr/bin/gcc /usr/lib/gcc /usr/libexec/gcc
whereis -b -B /usr/sbin -f nginx
# 输出:nginx: /usr/sbin/nginx
locate
locate
命令在某些系统上未安装,CentOS手动安装命令是:yum install -y mlocate
。locate
使用数据库来查找文件,因此非常快。如果索引数据库不存在,则无法工作,可用 updatedb
命令创建和更新索引数据库。
使用示例:
locate *.cpp
locate -c *.cpp // 仅统计数量
locate -n 20 *.cpp // 仅显示结果的前20条
grep
grep命令与前几条命令不一样,其 查找包含指定字符串的文件。作用非常强大,是搜索字符串的必备命令。
用法:
grep [选项] [模式] [文件]
其中模式和文件均可使用模糊匹配。
常用选项有:
-i: 不区分大小写
-r: 递归目录查找
-n: 打印关键字所在行号
-c: 只统计匹配的数目
使用示例:
grep -in vector * // 当前目录下查找包含vector内容的文件,不区分大小写
grep -rn vector * // 在当前路径下递归查找
grep -rc vector / // 统计根目录下包含vector的文件数目
总结
which
: 查找可执行命令
find
: 查找符合条件的文件
whereis
: 查找可执行文件及相关信息
locate
: 使用数据库快速查找系统中的任意文件
grep
: 搜索字符串
发表回复