Linux find ( find ) 命令用于在指定的目录层级(层次结构)下查找文件和目录。

find 命令的定义解释

find ( find ) 命令是 Linux 和 FreeBSD 系统管理员工具箱中最强大的工具之一。它根据用户给定的表达式在目录层次结构中搜索文件和目录,并可以对每个匹配的文件执行用户指定的操作。要在目录中搜索文件,find命令需要对该目录具有读权限。

您可以使用 find 命令根据文件和目录的权限、类型、日期、所有权、大小等来搜索它们。find 命令还可以与其他命令(如 grepsed)结合使用。

find 命令语法

find 命令的语法形式为:

find [options] [starting-point...] [expression]
  • [options]:可选的选项,用于控制符号链接的处理、调试选项和优化方法
  • [starting-point]:在其中搜索文件的起始目录或多个目录(也称:path)
  • [expression]:表达式由测试、动作、全局选项、位置选项、运算符组成。
  • find 命令中的选项可分为前置选项(此语法中 options)和 expression(表达式)中的全局选项、位置选项

find 命令使用示例

使用文件名查找文件

1、使用表达式 ( expression ) 中的选项 -name 查找对应文件名的文件:

find /home/u1sz -name file1.txt

输出内容为:

file1.txt

2、如果不区分文件中英文字母的大小写,使用 -iname 选项:

find /home/u1sz -iname file1.txt

输出内容为:

/home/u1sz/File1.txt
/home/u1sz/file1.txt

使用文件扩展名查找文件

1、使用表达式 ( expression ) 中的选项 -name 配合正则表达式的通配符 * 配置任意文件名并附加文件扩展名查找文件:

find /home/u1sz -name "*.txt"

输出内容为:

File1.txt
file1.txt
file2.txt
file3.txt

注意:

  • 在文件名中使用正则表达式的通配符 * 时,文件名必须加引号,否则不能匹配通配符
  • 要匹配字符星号 * 时,需要使用反斜杠 \ 对星号转义,如:匹配文件名 file*.txt ,指定的文件名字符串为 "file\*.txt"

2、使用表达式 ( expression ) 中的选项 -not 查找所有不匹配正则表达式 *.txt 的文件:

find /home/u1sz -not -name "*.txt"

结果可能会输出很多内容。

使用文件类型查找文件

有时可能需要搜索特定的文件类型,如常规文件、目录或符号链接。在 Linux 中,一切都是文件。

要根据文件类型搜索文件,请使用 -type 选项并指定文件类型的描述符,文件类型有:

符号 解释说明
f 常规文件
d 目录
l 符号链接
c 字符设备
b 块设备
p 命名管道 (FIFO)
s 套接字

1、查找当前目录下的所有目录:

find . -type d

2、使用 chmod 命令递归地将网站文件权限更改为 644,目录权限更改为 755

find /var/www/my_website -type d -exec chmod 0755 {} \;
find /var/www/my_website -type f -exec chmod 0644 {} \;

使用文件大小查找文件

要根据文件大小查找文件,需要传递 -size 选项和大小标准。您可以使用以下后缀来指定文件大小:

后缀 解释说明
b 512 字节的块(默认)
c 字节
w 双字节字
k 千字节
M 兆字节
G 千兆字节

查找小于给定的大小标准:大小标准前加 -

查找大于给定的大小标准:大小标准前加 +

查找一定大小范围内文件,联合使用 - +

1、查找当前目录下 1024 字节大小的所有文件:

find . -type f -size 1024c

2、查找当前目录下小于 1M 的所有文件:

find . -type f -size -1M

3、查找当前目录下大于 1M 的所有文件:

find . -type f -size +1M

4、查找当前目录下大于 1M 小于 10M 的所有文件:

find . -type f -size +1M -size -10M

根据修改日期查找文件

find 命令可以根据文件的最后修改、访问或更改时间搜索文件。

查找小于给定修改时间的前面加 -

查找大于给定修改时间的前面加 +

1、查找当前目录下 5 天前修改的文件:

find . -mtime 5

根据权限查找文件

find 命令根据文件权限查找文件,需要使用 -perm 选项。

可以在权限的八进制字符串前加上减号 - 或斜杠 / 做限制:

  • 当使用斜杠 / 作为前缀时,在权限的三个类别(用户、组或其他用户)中至少又一个类别匹配其相应的权限为,则匹配成功。
  • 当使用减号 - 作为前缀时,匹配的文件至少要包含设置的权限位,即:文件的权限设置大于等于给定的权限。

1、查找/var/www/html目录中权限为 775 的所有文件:

find /var/www/html -perm 755

2、查找当前目录下,用户、组或其他用户中只要有一类对文件具有读权限的文件:

find . -perm /444

3、查找用户至少有读写权限、组和其他用户至少有读权限的文件:

find . -perm -664

find 命令 options 选项解释

该选项是 find 命令的前置选项,而不是表达式(expression)中的全局选项或位置选项,前置选项是如何处理符号链接。

如下给出了 Linux find 命令中常用选项的解释说明:

选项 解释说明
-L 查找符号链接
-P 不查找符号链接

find 命令表达式 expression 解释

表达式由测试(Tests)、动作(Actions)、全局选项(Global options)、位置选项(Positional options)、运算符(Operators)组成。

表达式中动作的解释

如下给出了 find 命令表达式中常用动作的解释说明:

动作 解释说明
-exec command ; 执行命令,如果返回 0,则为True。在字符 ; 之前的参数,都被作为命令的参数。命令参数中的字符串 {} 会替换成当前文件名。这两个结构可能都需要做转义(用 \)处理,以便不使 shell 对它们做单独处理。指定的命令对每个匹配的文件运行一次。命令在起始目录下执行。在使用 -exec 动作时,存在不可避免的安全问题;您应该使用 -execdir 选项代替。
-exec command {} + 它是 -exec 动作的变体在选定的文件上运行指定的命令,但是命令行是通过在末尾附加每个选定的文件名来构建的;命令调用的总次数将远远少于匹配文件的数量。命令行的构建方式与 xargs 构建命令行的方式大致相同。命令中只允许有一个 {} 实例,并且它必须出现在末尾,紧接在 + 之前;它需要做转义(用 \)处理,使它不被shell解释。命令在起始目录下执行。如果任何带有‘ +’形式的调用返回非零值作为退出状态,则 find 返回非零退出状态。如果 find 遇到错误,有时会导致立即退出,因此一些挂起的命令可能根本不会运行。由于这个原因 -exec my-command ... {} + -quit 可能不会导致实际运行 my-command-exec 的这种变体总是返回 true

表达式中测试的解释

测试 解释说明
-amin n 查找在第 n 分钟内被访问过的文件
-atime n 查找在第 n*24 小时内被访问过的文件
-cmin n 查找在第 n 分钟内产生变化的文件
-ctime n 查找在第 n*24 小时内产生变化的文件
-mmin n 查找在第 n 分钟内被修改过的文件
-mtime n 查找在第 n*24 小时内被修改过的文件
-user 查找特定用户的文件
-group 查找特定组的文件
  • +n 表示大于该时间
  • -n 表示小于该时间

结语

在本教程中我们介绍了如何使用 find ( find ) 命令用于在指定的目录层级(层次结构)下查找文件和目录。find ( find ) 命令是 Linux 和 FreeBSD 系统管理员工具箱中最强大的工具之一。它根据用户给定的表达式在目录层次结构中搜索文件和目录,并可以对每个匹配的文件执行用户指定的操作。要在目录中搜索文件,find命令需要对该目录具有读权限。

您可以使用 find 命令根据文件和目录的权限、类型、日期、所有权、大小等来搜索它们。find 命令还可以与其他命令(如 grepsed)结合使用。

该 cmp 命令可以在 Linux 系统中使用,也可以在 FreeBSD 系统中使用。