一、工作方式
沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作。
二、基本用法
(1)根据文件名或正则表达式匹配搜索
find 搜索路径 -name "文件名"
eg.
①在当前目录下搜索以.txt结尾的文件,默认使用‘\n’为定界符,分隔文件名(即一个结果一行)
find . -name "*.txt"
②在/opt目录下搜索以.pdf结尾的文件,使用-print指定‘\0’作为定界符,分隔文件名
find /opt -name "*.pdf" -print0
③在上级目录下搜索文件名包含pdf,并且不区分大小 , -iname
find .. -iname "*pdf*"
④在当前目录下搜索以.txt或则.pdf的文件, 或 -o
find . \( -name "*.txt" -o -name "*.pdf" \)
⑤当前目录下,以linux开头并且以.pdf结尾的文件, 且 -a
find . \( -name "linux*" -a -name "*.pdf" \)
⑥-name是以文件名进行匹配,而-path将文件路径作为一个整体进行匹配
在/home目录下搜索包含sys的文件或则路径
find /home -path "*sys*"
(2)否定参数
使用 ! 进行参数的否定
eg.
①在当前目录下搜索除了以.txt结尾的文件
find ! -name "*.txt"
(3)基于目录深度的搜索
-mindepth 至少开始搜索的深度
-maxdepth 最多搜索的深度
eg.
①从第二层开始搜索
find / -mindepth 2 -name "*.pdf"
② 最大搜索4层
find / -maxdepth 4 -name "*.txt"
③只搜索一层
find / -maxdepth -name "*.chm"
(4)让find跳过特定的目录
-prune 跳过指定目录
eg.
①在/opt/eclipse目录下搜索文件以.ini结尾的文件,并且跳过目录dropins目录
find /opt/eclipse \( -name "dropins" -prune \) -o \( -name "*.ini" \)
(5)根据文件类型
文件类型 | 类型参数 |
普通文件 | f |
符号文件 | l |
目录 | d |
字符设备 | c |
块设备 | b |
套接字 | s |
FIFO(管道) | p |
find -type 文件类型 commands
eg.
①当前目录下查找文件
find . -type f
② 列出当前目录下的所有符号链接文件
find . -type l
(6)根据文件时间戳
访问时间:用户最近一次访问文件的时间
修改时间:文件内容最后一次被修改的时间
变化时间:文件元数据(metadata, 例如权限或所有权)最后一次改变的时间
天 | 分 | 具体时间前的 - 表示小于这个时间 + 表示大于这个时间 | |
访问时间 | atime | amin | |
修改时间 | mtime | mmin | |
变化时间 | ctime | cmin |
eg.
①当前目录下最近7天内被访问过的文件
find . -type f -atime -7
②当前目录下被修改超过9天的文件
find . -type f -mtime +9
③当前目录下被修改超过3分钟的文件
find . -type f -mmin +3
(7)基于文件大小
文件大小 | 单位 |
c | byte |
w | 2 byte |
b | 块 (512byte) |
k | 1024 byte |
M | 1024 k |
G | 1024 M |
eg.
①根目录下文件大小大于3K
find / -type f -size +3k
②根目录下文件大小小于2M
find / -type f -size -2M
③根目录下文件大小为2G
find / -type -size 2G
(8)基于文件权限和所有权的匹配
-perm 指定搜索的文件的权限
-user 指定搜索某个用户的文件
eg.
①当前目录下的具有644权限的py文件
find . \( -type f -a -name "*.py" -a -perm 644 \)
②当前目录下,属于用户root的文件
find . -type f -user root
(9)结合find命令使用 -exec 选项
使用-exec执行其他命令
eg.
①将当前目录下的root用户的文件改为my用户的
find . -type f -user root -exec chown my {} \;
{}是一个特殊字符串,和-exec一起使用时,{}将用每一find的结果进行替换
②将当前目录下所有的txt文件合并到一个文件中
find . -type f -exec cat {} \; > all.txt
这里使用的是> 而没有使用>>,因为find命令的全部输出只是一个单一流,只有多个数据流被追加到同一个文件时才使用>>.
(10)删除匹配的文件
-delete可以删除find找到的文件
eg.
①删除当前目录下的.swap文件
find . -type f -name "*.swap" -delete