Linux Find 备忘清单

原创
2023/10/11 10:53
阅读数 67

 image

引言

这是 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

三、进阶使用

有时候我们查找文件可能还会对这些文件进行后续的操作,例如删除,修改权限等。可以使用以下命令:

命令 说明
-print 默认的处理动作,显示至屏幕
-ls 类似于对查找到的文件执行“ls -l”命令
-delete 删除查找到的文件 慎用!
-fls file 查找到的所有文件的长格式信息保存至指定文件中,也可用重定向的方式
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,没有-ok中的交互式确认。<br />其中{}用于引用查找到的文件名称自身,;是配合-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 查找并排除目录

# 查找当前目录及子目录中的所有js文件,但是排除掉node_modules目录中的
find . -type f -name "*.js" -not -path "./node_modules/*"

四、小结

  find命令通常进行的是从根目录开始的全盘搜索,搜索位置越大,消耗系统资源越多。对于服务器负载较高的情况,建议不要在高峰时期使用find命令的模糊搜索,会相对消耗较多的系统资源。在生产服务器上搜索的时候,尽量不在根目录下搜索,把搜索的范围尽量控制在最小。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部