文章目录
- 引言
- 一、入门
- 1.1 简介
- 1.2 命令用法
- 二、基本使用
- 2.1 根据文件大小查找
- 2.2 根据文件类型查找
- 2.3 根据文件名查找
- 2.4 指定搜索目录层级/深度
- 2.5 根据权限查找
- 2.6 根据属主/属组查找
- 2.7 多个文件名
- 2.8 多个目录
- 2.9 根据时间戳查找
- 三、进阶使用
- 3.1 查找和删除
- 3.2 查找和移动
- 3.3 查找和复制
- 3.4 查找和排序
- 3.5 查找和 chmod
- 3.6 查找并排除目录
- 四、小结
引言
这是 Linux find 命令备忘清单的快速参考列表,包含常用选项和示例。
一、入门
1.1 简介
在 Linux 系统中,搜索工作一般都是通过find命令来完成的,它可以使用不同的文件特性作为寻找条件(如文件名、大小、修改时间、权限等信息),一旦匹配成功则默认将信息显示到屏幕上。find在工作时会遍历指定的目录,通过匹配指定的条件搜寻我们需要的文件或者目录。因此,find命令具有以下特点:
- 查找速度略慢
- 精确查找
- 实时查找
- 可能只搜索用户具备读取和执行权限的目录
1.2 命令用法
find 命令用于按照指定条件来查找文件所对应的位置,语法格式如下所示:
find [path...] [options] [expression]
参数 | 描述 |
---|---|
path… | 需要查找文件所指定的路径。如果不指定,则默认为当前目录及其子目录 |
options | |
expression | 匹配条件/表达式。如果未设置匹配条件,则默认查找指定目录及子目录下所有文件 |
find命令的参数以及作用如下表所示。
参数 | 示例 | 描述 |
---|---|---|
-type | find . -type d | 仅查找目录 |
-name | find . -type f -name “*.txt” | 按名称查找文件 |
-iname | find . -type f -iname “hello” | 按名称查找文件(不区分大小写) |
-size | find . -size +1G | 查找大于 1G 的文件 |
-user | find . -type d -user jack | 查找杰克的文件 |
-regex | find /var -regex ‘.*/tmp/.[0-9].file’ | 将正则表达式与查找一起使用 |
-maxdepth | find . -maxdepth 1 -name “a.txt” | 在当前目录和子目录中 |
-mindepth | find / -mindepth 3 -maxdepth 5 -name pass | 在子目录级别 2 和 4 之间 |
-atime | find / -atime 50 | 访问时间(上次文件打开) |
-mtime | find / -mtime 50 | 修改时间(上次文件内容被修改) |
二、基本使用
2.1 根据文件大小查找
命令用法为
find 搜索路径 [选项] 搜索内容
其中,选项是 -size [+|-]N
,这里的“+”的意思是搜索比指定大小还要大的文件,“-”的意思是搜索比指定大小还要小的文件。N为文件大小,单位为c/k/M/G,如下所示:
命令 | 说明 |
---|---|
-size b | 默认单位,如果单位为b或不写单位,则按照512 Byte搜索 |
-size c | 搜索单位是c,按照字节搜索。 |
-size w | 搜索单位是w,按照双字节(中文)搜索。 |
-size k | 按照KB单位搜索,必须是小写的k。 |
-size M | 按照MB单位搜索,必须是大写的M |
-size G | 按照GB单位搜索,必须是大写的G |
示例如下所示:
# 在当前目录下搜索文件大小为28k的文件
find . -size 28k
# 查找所有大于 10MB 的文件
find / -size +10M
# 查找所有小于 10MB 的文件
find / -size -10M
# 查找所有正好为 10M 的文件
find / -size 10M
# 查找 100MB 和 1GB 之间的大小
find / -size +100M -size -1G
2.2 根据文件类型查找
Linux系统中的文件大致分为以下种:普通文件、目录文件、二进制程序文件、符号链接文件、套接字文件、块设备文件、字符设备文件。我们可以指定搜索文件的文件类型以达到查找文件的目的。命令用法为
find 搜索路径 [选项] 搜索内容
所搜文件的具体类型有TYPE的值确定。TYPE的值及具体含义如下:
命令 | 说明 |
---|---|
-type f | 查找普通文件 |
-type d | 查找目录文件 |
-type l | 查找符号链接文件 |
-type s | 查找套接字文件 |
-type b | 查找块设备文件 |
-type c | 查找字符设备文件 |
-type p | 查找管道文件 |
示例如下所示:
# 使用名称查找目录
find / -type d -name tecmint
# 使用名称查找php文件
find . -type f -name tecmint.php
# 查找目录下的所有php文件
find . -type f -name "*.php"
2.3 根据文件名查找
在下面的例子中,我们使用了-name选项查找f开头的文件,现在我们开始讲解如何根据文件名查找指定文件。
find 搜索路径 [选项] 搜索内容
其中,选项参数如下表所示:
参数 | 说明 |
---|---|
-name | 按照文件名搜索 |
-iname | 按照文件名搜索,不区分文件名大小写 |
示例如下所示:
# 在当前目录中使用名称查找文件
find . -name tecmint.txt
# 查找主目录下的文件
find /home -name tecmint.txt
# 使用名称查找文件并忽略大小写
find /home -iname tecmint.txt
2.4 指定搜索目录层级/深度
指定搜索目录的层级需要用到选项-maxdepth和-mindepth,分别指定搜索目录的最大深度和最小深度。两个选项可以配合使用,指定搜索目录的深度范围。如果-maxdepth/-mindepth二者的参数相同,则find命令会搜索某个特定深度的文件。
参数 | 说明 |
---|---|
-maxdepth level | 指定最大搜索目录深度level,指定的目录为第1级 |
-mindepth level | 指定最小搜索目录深度level。配合-maxdepth可搜索指定深度的文件。 |
示例如下所示:
# 该命令中”/”为第一级目录,查找文件的最大目录深度为2。
find / -maxdepth 2 -name "*.conf"
2.5 根据权限查找
我们可以根据文件三类访问对象的三种三种权限查找对应文件,命令用法如下:
find 搜索路径 [选项] 搜索内容
其中,选项参数如下表所示:
参数 | 描述 |
---|---|
-perm | 查找文件权限刚好等于“权限模式”的文件 |
-perm -权限模式 | 查找文件权限全部包含“权限模式”的文件 |
-perm +权限模式 | 查找文件权限包含“权限模式”的任意一个权限的文件 |
示例如下所示:
# 查找权限为 777 的文件
find . -type f -perm 0777 -print
# 查找未经许可的文件 777
find / -type f ! -perm 777
# 查找 SUID 集文件
find / -perm /u=s
# 查找 SGID 集文件
find / -perm /g=s
# 查找只读文件
$ find / -perm /u=r
# 查找可执行文件
find / -perm /a=x
2.6 根据属主/属组查找
根据文件的属主以及属组信息,我们可以查找符合指定属主、属组的文件。相关选项用法如下:
find 搜索路径 [选项] 搜索内容
其中,选项参数如下表所示:
命令 | 说明 |
---|---|
-user username | 查找属主为指定用户(UID)的文件 |
-group groupname | 查找属组为指定组(GID)的文件 |
-uid UseerID | 查找属主为指定的UID号的文件 |
-gid GroupID | 查找属组为指定的GID号的文件 |
-nouser | 查找没有属主的文件 |
-nogroup | 查找没有属组的文件 |
示例如下所示:
# 根据用户查找单个文件
find / -user root -name tecmint.txt
# 根据用户查找所有文件
find /home -user tecmint
# 根据组查找所有文件
find /home -group developer
# 查找用户的特定文件
find /home -user tecmint -iname "*.txt"
2.7 多个文件名
# 查找带有 .sh 或 .txt 扩展名的文件
find . -type f \( -name "*.sh" -or -name "*.txt" \)
2.8 多个目录
# 查找具有多个目录的文件
find /opt /usr /var -name foo.scala -type f
2.9 根据时间戳查找
文件的时间戳分为访问时间(access time)、修改时间(modify time)、创建时间(create time),分别简写为atime/mtime/ctime。我们可以根据这三个时间戳查找对应文件。命令用法如下:
find 搜索路径 [选项] 搜索内容
其中,选项参数如下表所示:
参数 | 说明 |
---|---|
-atime [+|-]时间 | 按照文件访问时间搜索 |
-mtime [+|-]时间 | 按照文件数据修改时间搜索 |
-ctime [+|-]时间 | 按照文件状态修改时间搜索 |
提示:也有-amin、-mmin等时间选项,时间单位为分钟。
命令 | 说明 |
---|---|
-mtime +0 | 24 小时前修改 |
-mtime 0 | 从现在到 1 天前修改 |
-mtime -1 | 不到 1 天前修改(与 -mtime 0 相同) |
-mtime 1 | 24 至 48 小时前修改 |
-mtime +1 | 超过 48 小时前修改 |
-mtime +1w | 上次修改时间超过 1 周前 |
-atime 0 | 从现在到 24 小时前最后一次访问 |
-atime +0 | 访问时间超过 24 小时 |
-atime 1 | 在 24 至 48 小时前访问 |
-atime +1 | 访问时间超过 48 小时 |
-atime -1 | 不到 24 小时前访问过(与 -atime 0 相同) |
示例如下所示:
# 查找最近 50 天修改的文件
find / -mtime 50
# 查找最近 50 天访问的文件
find / -atime 50
# 查找最近 50-100 天修改的文件
find / -mtime +50 –mtime -100
# 查找最近 1 小时内更改的文件
find / -cmin -60
# 查找最近 1 小时内修改过的文件
find / -mmin -60
# 查找最近 1 小时内访问过的文件
find / -amin -60
三、进阶使用
有时候我们查找文件可能还会对这些文件进行后续的操作,例如删除,修改权限等。可以使用以下命令:
命令 | 说明 |
---|---|
默认的处理动作,显示至屏幕 | |
-ls | 类似于对查找到的文件执行“ls -l”命令 |
-delete | 删除查找到的文件 慎用! |
-fls file | 查找到的所有文件的长格式信息保存至指定文件中,也可用重定向的方式 |
-ok COMMAND {} \; | 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认 |
-exec COMMAND {} \; | 对查找到的每个文件执行由COMMAND指定的命令,没有-ok中的交互式确认。 其中{}用于引用查找到的文件名称自身,;是配合-ok和-exec选项的 |
3.1 查找和删除
# 查找并删除多个文件
find . -type f -name "*.mp3" -exec rm -f {} \;
# 查找和删除单个文件
find . -type f -name "tecmint.txt" -exec rm -f {} \;
# 查找和删除 100mb 文件
find / -type f -size +100m -exec rm -f {} \;
# 查找特定文件并删除
find / -type f -name *.mp3 -size +10m -exec rm {} \;
3.2 查找和移动
# 查找并将其移动到特定目录
find . -name '*.mp3' -exec mv {} /tmp/music \;
3.3 查找和复制
# 查找并将其复制到特定目录
find . -name '*2020*.xml' -exec cp -r "{}" /tmp/backup \;
3.4 查找和排序
find . -printf "%T+\t%p\n" | sort
find . -printf "%T+\t%p\n" | sort -r
3.5 查找和 chmod
# 查找文件并将权限设置为 644
find / -type f -perm 777 -print -exec chmod 644 {} \;
# 查找目录并将权限设置为 755。
find / -type d -perm 777 -print -exec chmod 755 {} \;
3.6 查找并排除目录
# 查找当前目录及子目录中的所有js文件,但是排除掉node_modules目录中的
find . -type f -name "*.js" -not -path "./node_modules/*"
四、小结
find命令通常进行的是从根目录开始的全盘搜索,搜索位置越大,消耗系统资源越多。对于服务器负载较高的情况,建议不要在高峰时期使用find命令的模糊搜索,会相对消耗较多的系统资源。在生产服务器上搜索的时候,尽量不在根目录下搜索,把搜索的范围尽量控制在最小。