概述
find
命令可以在目录层次结构中搜索符合指定条件的文件或目录,并且可以它们执行指定的操作。而搜索条件可以是文件权限、文件类型、日期、大小等。
语法
该命令的语法如下:
# find 命令从指定的起始目录开始,递归地搜索其各个子目录,查找满足条件的文件并对之采取相关的操作
find [指定起始目录] 查找条件 [操作]
该命令支持的选项有:
选项 | 说明 |
---|---|
-mount, -xdev | 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件 |
-amin n | 在过去 n 分钟内被读取过 |
-anewer file | 比文件 file 更晚被读取过的文件 |
-atime n | 在过去 n 天内被读取过的文件 |
-cmin n | 在过去 n 分钟内被修改过 |
-cnewer file | 比文件 file 更新的文件 |
-ctime n | 在过去 n 天内创建的文件 |
-mtime n | 在过去 n 天内修改过的文件 |
-empty | 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name |
-ipath p, -path p | 路径名称符合 p 的文件,ipath 会忽略大小写 |
-name name, -iname name | 文件名称符合 name 的文件。iname 会忽略大小写 |
-size n | 文件大小 是 n 单位 |
-type c | 文件类型是 c 的文件 |
使用
按文件名查找文件
按文件名查找文件支持的选项有:
选项 | 说明 |
---|---|
-name <指定文件名> |
按指定文件文件名查找文件 |
-iname <指定文件名> |
按指定文件文件名查找文件,但忽略文件名的大小写 |
命令格式如下:
# 语法
find 指定起始目录 -name 指定文件名
# 示例
find /root/ -name test.txt
find /root/ -iname TEST.txt
按扩展名查找文件
按扩展名搜索文件与按名称搜索文件相同,都是使用 -name
选项,但需要用到通配符 *
,如要匹配所有以 .txt
后缀结尾的文件,就要写成 -name *.txt
。如果要查与正则表达式不匹配的所有文件,可以加上 -not
选项,即如果要查找所有不以 .txt
后缀结尾的文件,就要写成 -not -name *.txt
。
选项 | 说明 |
---|---|
-not EXPR |
不与正则表达式 EXPR 匹配的情况 |
语法如下:
# 语法
# 查找指定目录下所有以指定后缀结尾的文件
find 指定起始目录 -name *指定后缀
# 查找指定目录下所有不以指定后缀结尾的文件
find 指定起始目录 -not -name *指定后缀
# 示例
# 查找 /root/abc/ 目录下所有以 .txt 为后缀结尾的文件
find /root/abc/ -name *.txt
# 查找 /root/abc/ 目录下所有不以 .txt 为后缀结尾的文件
find /root/abc/ -not -name *.txt
按文件类型查找文件
有时您可能需要搜索特定文件类型,例如常规文件、目录或符号链接。在 Linux 中,一切都是文件。要根据文件类型搜索文件,请使用 -type
选项和以下描述符之一来指定文件类型:
文件类型描述符 | 说明 |
---|---|
f |
一个普通文件 |
d |
目录 |
l |
符号链接 |
c |
字符设备 |
b |
块设备 |
p |
FIFO |
s |
socket 文件 |
语法格式如下:
# 语法
find 指定起始目录 -type 文件类型描述符
# 示例,查找 /root/abc/ 目录下所有普通文件
find /root/abc/ -type f
按大小查找文件
要根据文件大小查找文件,使用 -size
选项与大小标准一起传递。可以使用以下后缀来指定文件大小:
文件大小标识后缀 | 说明 |
---|---|
b |
512字节块,默认 |
c |
字节 |
w |
两字节 |
k |
千字节 |
M |
兆字节 |
G |
千兆字节 |
我们可以查找文件大小恰好等于、小于或大小指定大小的文件,其命令格式如下:
# 语法
find 指定起始目录 -size [+-]大小[文件大小标识后缀]
# 示例
# 在 /root/ 目录下查找文件大小等于 10 字节的文件
find /root/ -size 10c
# 在 /root/ 目录下查找文件大小小于 1MB 的文件,其中减号表示小于
find /root/ -size -1M
# 在 /root/ 目录下查找文件大小大于 1MB 的文件,其中加号表示大于
find /root/ -size +1M
# 在 /root 目录下查找文件大小在 1MB 和 21MB 之间的文件
find /root -size +1M -size -21M
注:
+20
表示 20 之后,如 21、22、23 等。-20
表示 20 之前,如 19、18、17 等。20
表示恰好是 20。
按时间查找文件
我们可以通过文件的修改时间和访问时间来查找文件,跟文件时间有关的选项有:
选项 | 说明 |
---|---|
-amin N | 查找 N 分钟前被访问过的所有文件 |
-atime N | 查找 N 天前被访问过的所有文件 |
-cmin N | 查找 N 分钟前文件状态被修改过的所有文件 |
-ctime N | 查找 N 天前文件状态被修改过的所有文件 |
-mmin N | 查找 N 分钟前文件内容被修改过的所有文件 |
-mtime N | 查找 N 天前文件内容被修改过的所有文件 |
示例如下:
# 查找 /root/ 目录下 3 天前文件内容被修改过的文件
find /root/ -mtime 3
按权限查找文件
如果想要根据权限来查找文件,那么得使用 -perm
选项:
# 语法
find 指定起始目录 -perm 表示权限的数字
# 示例,查找 /root/ 目录下所有具有可读可写可执行权限的文件
find /root/ -perm 777
按所有者查找文件
如果我们要查找指定所有者或所属组的文件,那么可以使用以下选项:
选项 | 说明 |
---|---|
-gid N | 查找组 id 是 N 的所有文件 |
-uid N | 查找用户 id 是 N 的所有文件 |
-group 组名 | 查找属于指定用户组的所有文件 |
-user 用户名 | 查找属于指定用户的所有文件 |
示例如下:
# 查找 /root/ 目录下所有属于用户 zs 的文件
find /root/ -user zs
逻辑运算符组成的复合条件
该命令还支持用逻辑运算符 not
、and
、or
组成的复合条件。各逻辑运算符说明如下:
逻辑运算符 | 说明 | 举例 | 例子说明 |
---|---|---|---|
and |
逻辑与,在命令中用选项 -a 表示,是默认选项,表示当所有条件都满足时,查找条件才匹配 |
find /root/ -name test.txt -user 'zs' |
查找 /root/ 目录下文件名为 test.txt 并且是 zs 创建的文件 |
or |
逻辑或,在命令中用选项 -o 表示,表示当只要有一个条件被满足时,查找条件就匹配 |
find /root/ -name test.txt -o -user 'zs' |
查找 /root/ 目录文件名为 test.txt 或者是由 zs 创建的文件 |
not |
逻辑非,在命令用 ! 表示,表示查找不满足给定条件的文件 |
find /root/ ! -name test.txt |
查找 /root 目录下所有文件名不少 test.txt 的文件 |
注:当由多个逻辑选项时,可以用括号把这些逻辑选项括起来。但为了避免 Shell 本身对括号引起误解,在话号前需要加转义字符
\
来去除括号的意义。例:find /root/ \(-name test.txt -user 'zs' \)
。
对找到的文件执行操作
我们可以对找到的文件直接执行操作,那么支持的选项有:
选项 | 说明 |
---|---|
-exec 命令名称 {} \; |
对符合条件的文件执行所给的Linux 命令,而不询问用户是否需要执行该命令。{} 表示命令的参数即为所找到的文件;命令的末尾必须以 \; 结束。 |
ok 命令名称 {} \; |
对符合条件的文件执行所给的Linux 命令,与exec不同的是,它会询问用户是否需要执行该命令。 |
示例如下:
# 在 /root/ 目录下查找文件名为 test.txt 文件,找到之后统计该文件的行数
find /root/ -name test.txt -exec wc -l {} \;
查找隐藏文件
在 Linux 系统中凡是文件名或目录名是以 .
开头的都是隐藏文件。通过 ls
命令是看不到的,必须通过 ls -a
才能看到这些隐藏的文件。
如果只是通过 find
命令是会找出所有文件的,包括隐藏文件和非隐藏文件。但有时候如果我们想要只查找隐藏或只查找非隐藏文件,就必须结合 grep
命令一起使用才能达到想要的效果。因为隐藏文件是 .
开头的,所以根据这个特性,用正则表达式去匹配,但是在正则表达式中 .
是有特殊含义的,所以要进行转义 \.
。命令格式如下:
# 只查找指定目录下的所有隐藏文件
# `\.` 表示匹配普通的点字符 `.`;而 `\` 又是特殊字符需要进行转义就是 `\\.`;而由于 find 命令查询的结果是文件路径,所以隐藏文件的点字符的前一个字符是 `/`
find 指定目录 -type f | grep "/\\."
# 示例,查找 /home 目录下的所有隐藏文件
find /home -type f | grep "/\\."
# 只查找指定目录下的所有非隐藏文件
# `\.` 表示匹配普通的点字符 `.`;而 `\` 又是特殊字符需要进行转义就是 `\\.`;而由于 find 命令查询的结果是文件路径,所以隐藏文件的点字符的前一个字符是 `/`
# -v 选项表示除匹配项之外的所有项
find 指定目录 -type f | grep -v "/\\."
# 示例,查找 /home 目录下的所有隐藏文件
find /home -type f | grep -v "/\\."