# find
# 语法格式
find [路径] [选项] [操作]
# 选项
# 常用的选项列表
选项 | 含义 |
---|---|
-name | 根据文件名查找,支持*模糊匹配,匹配大小写 |
-iname | 根据文件名查找,支持*模糊匹配,不匹配大小写 |
-perm | 根据文件权限查找 |
-prune | 该选项可以排除某些查找目录,通常与-path 一起用,用法是 find . -path 要排除的目录 -prune -o -type f |
-user | 根据文件属主查找 |
-group | 根据文件属组查找 |
-mtime -n | +n | 根据文件更改时间查找 (天) |
-mmin -n | +n | 根据文件更改时间查找 (分钟) |
-nogroup | 查找无有效属组的文件 |
-nouser | 查找无有效属主的文件 |
-newer file1 | 查找更改时间比 file1 新的文件 |
-type | 按文件类型查找 |
-size -n +n | 按文件大小查找 |
-mindepth n | 从 n 级子目录开始搜索 |
-maxdepth n | 最多搜索到 n 级子目录 |
- ⚠️ maxos 中路径必须格式为/etc/,而 Linux 中可以写为/etc
-type
f 文件 find . -type f
d 目录 find . -type d
c 字符设备文件 find . -type c
b 块设备文件 find . -type b
l 链接文件 find . -type l
p 管道文件 find . -type p
-size
-n 大小 小于 n 的文件
+n 大小 大于 n 的文件
例子 1:查找/etc 目录下小于 10000 字节(B)的文件 find /etc -size -10000c
例子 2:查找/etc 目录下大于 1M 的文件 find /etc -size +1M
-mtime
-n n天以内修改的文件
+n n天以外修改的文件
n 正好n天修改的文件
例子1:查找/etc目录下5天之内修改且以conf结尾的文件 find /etc -mtime -5 -name '*.conf'
例子2:查找/etc目录下10天之前修改且属主为root的文件 find /etc -mtime +10 -user root
-mmin
-n n分钟以内修改的文件
+n n分钟以外修改的文件
例子1:查找/etc目录下30分钟之前修改的文件 find /etc -mmin +30
例子2:查找/etc目录下30分钟之内修改的目录 find /etc -mmin -30 -type d
-prune
通常和-path一起使用,用于将特定目录排除在搜索条件之外
例子1:查找当前目录下所有普通文件,但排除test目录
find . -path ./etc -prune -o -type f
例子2:查找当前目录下所有普通文件,但排除etc和opt目录
find . -path ./etc -prune -o -path ./opt -prune -o -type f
例子3:查找当前目录下所有普通文件,但排除etc和opt目录,但属主为hdfs
find . -path ./etc -prune -o -path ./opt -prune -o -type f -a -user hdfs
例子4:查找当前目录下所有普通文件,但排除etc和opt目录,但属主为hdfs,且文件大小必须大于500字节
find . -path ./etc -prune -o -path ./opt -prune -o -type f -a -user hdfs -a -size +500c
# 示例|
# 查找etc目录下第一级目录中.conf结尾|的文件
find /etc/ -name '*conf' -maxdepth 1
# 获取当前目录下以docs结尾的文件|
find . -iname "*docs"
# 查找当前目录下第一级目录中用户是li|jinchao的文件
find . -user lijinchao -maxdepth 1
# 查找etc目录下的目录文件
find /etc/ -type d
# 查找etc目录下大于500kb的文件
find /etc/ -size +500k
# 查找etc目录下权限是777的文件
find /etc/ -perm 777
# 查找当前目录下排除node_modules文件的其他文件
find . -path ./node_modules -prune -size -200k -o -type f
# 查找当前目录下排除node_modules和.git文件的其他文件
find . -path ./node_modules -prune -o -path ./.git -prune -o -type f -size -200k
# 操作
# 常用操作
选项 | 含义 |
---|---|
打印输出(默认执行) | |
-exec | 格式为-exec 'command' {} ; |
-ok | 和 exec 功能一样,只是每次操作都会给用户提示 |
例子1:搜索/test下的文件(非目录),文件名以conf结尾,且大于10k,然后将其删除
find ./test/ -type f -name '*.conf' -size +10k -exec rm -f {} \;
例子2:将/var/log/目录下以log结尾的文件,且更改时间在7天以上的删除
find /var/log/ -name '*.log' -mtime +7 -exec rm -rf {} \;
例子3:搜索条件和例子1一样,只是不删除,而是将其复制到/root/conf目录下
find ./etc/ -size +10k -type f -name '*.conf' -exec cp {} /root/conf/ \;
- -exec 中的{}表示前 find 到的所有文件
# 查找并删除当前目录下的test*的文件
find . -name "test*" -maxdepth 1 -exec rm {} \;
# 逻辑运算符
选项 | 含义 |
---|---|
-a | 与(默认执行) |
-o | 或 |
-not | 非 |
例子1:查找当前目录下,属主不是hdfs的所有文件
find . -not -user hdfs | find . ! -user hdfs
例子2:查找当前目录下,属主属于hdfs,且大小大于300字节的文件
find . -type f -a -user hdfs -a -size +300c
例子3:查找当前目录下的属主为hdfs或者以conf结尾的普通文件
find . -type f -a \( -user hdfs -o -name '*.conf' \) -exec ls -rlt {} \;
- 多个条件与和或一起出现的时候往往需要用()括起来,记得转义
# find、locate、whereis 和 which 总结以及适用场景分析
命令 | 适用场景 | 优缺点 |
---|---|---|
find | 通配 | 功能强大,速度慢 |
locate | 只能查找单个文件 | 功能单一,速度快 |
whereis | 查找程序的可执行文件、帮助文档等 | 不常用 |
which | 只查找程序的可执行文件 | 常用于查找程序的绝对路径 |
# locate
如果是第一次使用 locate 的话
WARNING: The locate database (/var/db/locate.database) does not exist.
To create the database, run the following command:
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
Please be aware that the database can take some time to generate; once
the database has been created, this message will no longer appear.
文件查找命令,所属软件包 mlocate
不同于 find 命令是在整块磁盘中搜索,locate 命令在数据库文件中查找。这个数据库文件是系统有一个定时任务自行备份生成的,一般在第二天执行,在执行前是查不到的。
updatedb # 更新locate脚本
- find 默认是精确匹配,locate 默认是模糊匹配
# whereis
选项 | 含义 |
---|---|
-b | 只返回二进制文件 |
-m | 只返回帮助文档文件 |
-s | 只返回源代码文件 |
whereis log
# which
选项 | 含义 |
---|---|
-b | 只返回二进制文件 |
which log