# 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

# 操作

# 常用操作

选项 含义
-print 打印输出(默认执行)
-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