查找是非常常用的功能,Linux下提供了4个小工具,用来提供查找功能。它们分别为:find、which、whereis、locate,其查找功能各有侧重点,可以根据使用的场景来选择合适的工具程序。
find [-H] [-L] [-P] [-Olevel] [-D debugopts] [path…] [expression]
在目录层级中搜索文件。
path默认为当前目录,expression默认为打印找到的文件信息。
位置选项,它们影响命令行后后面的测试。
以今天起始时间为标准来衡量。
# 在30分钟前内容修改过的文件
find ./ -name '.cpp" -mmin -30
# 在30天内访问过的文件
find ./ -name '.cpp" -atime -30
# 在30天整时状态发生谈过的文件
find ./ -name '.cpp" -ctime 30
查找符合正则表达式的文件。
# 查找所有以"course"开头的子目录,但是他们下一个版本
find test -type d -regex '.*/course[0-9.]*'
为了防止歧义,全局选项应该放在位置选项后,放在测试选项前。
运算符主要是完成逻辑操作,形式为:逻辑非“!”、逻辑或“-o”、逻辑与“-a”。
# 表示检索当前目录下,不属于root用户的文件
find . ! -user root
# 表示检索根目录下超过30天没有访问的,文件扩展名为.o或者文件名为a.out的所有文件。
# “\(“转义字符加个特殊符号,防止shell对其进行了解析
find / −name ‘∗.o′ −o −namea.out -atime +30
# 表示检索根目录下的属于book用户的所有子目录
find / -type d -a -user book
比较测试。
# 在当前目录指定搜索文件名
find . -name abc.txt
# 在当前目录指定搜索文件名,大小写不敏感
find . -iname abc.txt
# 在当前目录指定inode搜索
find . -inum 543886
# 在当前目录搜索所有abc开头的文件
find . -name "abc*"
# 搜索23字节的文件
find . -size 23c
# 搜索一个大于10MB的文件
find . -size +10M
# 搜索一个小于10字节的文件
find . -size -10c
# 搜索指定权限的文件
find . -perm 777
# 搜索root用户权限的文件
find . -user root
# 搜索以m开头的目录
find . -type d -name "m*"
# 搜索以m开头的文件
find . -type f -name "m*"
# 搜索软件链接文件
find . -type l
# 搜索空文件
find ./ -empty
搜索到目标之后,执行指定的动作。
# 删除以.obj结尾的文件
find . -name "*.obj" -delete
# 删除以.obj结尾的文件,会提示确认
find . -name "*.obj" -ok rm {} \;
# 删除以.obj结尾的文件
find . -name "*.js" -exec rm {} \;
# 查找系统中所有文件长度为 0 的普通文件,并列出它们的完整路径:
find / -type f -size 0 -exec ls -l {} \;
# 列出所有o结尾的文件详细信息
# find . -name "*.o" -ls
which是搜索环境目录中(通常是usr/bin)中的可执行文件,并返回第一个满足要求的完整路径。
which gcc
#输出:/usr/bin/gcc
whereis [options] [-BMS
… -f]
主要是搜索所有的可执行文件、帮助文档。
# 显示所有的gcc的路径
whereis -b gcc
# 显示所有gcc相关的可执行文件,帮助文档,资源
whereis -bms gcc
whereis gcc
# 只在/usr/bin目录搜索可执行文件,可以在其他目录搜索帮助手册和代码。
whereis -B /usr/bin -f gcc
#
locate不是Linux自带的搜索工具,需要安装。其主要功能是通过先索引文件信息到数据库,再来搜索文件信息。
sudo apt install mlocate
安装完之后,locate工具会搜索所有文件,建立索引数据库以提高搜索速度。
locate默认每24小时更新一次数据库。也可以手动更新:
sudo updatedb
Usage: locate [OPTION]… [PATTERN]…
| 短标识 | 长标识 | 作用 |
|---|---|---|
| -A, | –all | 仅打印满足全部模式的条目 |
| -b, | –basename | 仅匹配文件名 |
| -c, | –count | 打印匹配的条目数 |
| -d, | –database DBPATH | 指定DBPATH代替默认的数据库 |
| -e, | –existing | 仅打印当前存在的文件条目 |
| -L, | –follow | 追踪软链接 |
| -h, | –help | 输出帮助信息 |
| -i, | –ignore-case | 忽略大小写 |
| -p, | –ignore-spaces | 忽略符号和空格 |
| -t, | –transliterate | 忽略重音 |
| -l, | –limit, -n LIMIT | 限制输出数 |
| -P, | –nofollow, -H | 不跟踪软链接 |
| -0, | –null | 用空来分隔输出 |
| -S, | –statistics | 打印数据库已经使用的统计信息 |
| -q, | –quiet | 不报告有关读取数据库的错误信息 |
| -r, | –regexp --regex | 利用正则表达式搜索 |
| -V, | –version | 打印版本信息 |
| -w, | –wholename | 匹配完整路径名(默认) |
# 查找所有路径包括gcc的的文件目录
locate gcc
# 查找文件名包括gcc的
locate -b gcc
# 查找所有文件名为gcc的文件
locate -r /gcc$
# 手动更新数据库索引
updatedb