find 命令在 Linux 上的工作原理

Linux 和类 Unix 系统(即 MacOS)上的 find 命令用于在特定目录中查找文件和目录。当您尝试查找和处理多个文件时,它是您可以使用的最有用的命令之一。它在文件审核期间也非常有用。

find 的语法如下所示,其中[OPTIONS]是可选设置,[LOCATION] 是您要在其中查找内容的位置,[SEARCH TERM] 是您要查找的文件名或目录名。

find [OPTIONS] [LOCATION] [SEARCH TERM]

如何在 Linux 和 MacOS 上使用 find 命令#

该命令的最基本形式find如下所示:

find ./test *.txt

上述命令将查找任何以 结尾的文件.txt,即*.txt./test文件夹中。这将返回所有匹配文件的列表。

处理符号链接

某些文件夹可能包含链接到文件系统另一部分的符号链接。因此,如果符号链接确实存在,您可能会在不知不觉中搜索更大的文件夹集。因此,有许多选项可以控制find遇到符号链接时发生的情况:

  • -P– 使用时,从不遵循符号链接。
  • -L– 使用时,始终遵循符号链接。
  • -H– 使用时,符号链接仅在命令行某处提及时才会被跟踪,即,如果您搜索link,并且有一个名为 的符号链接link,find 将link与跟随该符号链接时找到的任何内容一起返回。

这些选项中的任何一个都可以使用,如下所示:

find -P ./test *.txt

按类型搜索文件#

由于有许多不同类型的文件和目录,仅搜索特定字符串并不总是有用的。如果我们想提及我们正在寻找的文件或目录的类型,我们可以使用-type选项指定。为了消除歧义,我们还在-name搜索字符串之前添加了选项。您也可以完全删除搜索字符串,然后搜索特定的文件类型。

下面,我们搜索所有 type f,它定义了一个常规文件。

find ./test -type f -name "*.txt"

所有类型的完整列表可以在下面找到:

  • b– 块设备
  • c– 字符设备
  • d– 目录
  • p– 命名管道(FIFO)
  • f– 常规文件
  • l– 符号链接 – 如果我们使用符号链接-L选项,则永远不会使用。
  • s– 插座

按尺寸搜索#

-size我们可以使用该选项按大小搜索。例如,我们要查找所有大小为 10MB 的文件,我们使用10M

find ./test -size 10M

这不是特别有用,所以如果我们想查找低于或高于某个大小的文件,我们分别添加-+。例如,下面将找到所有小于 10MB 的文件。

find ./test -size -10M

由于尺寸不是正常单位,即mbgbkb,因此可以在下面找到完整的单位列表:

  • b– 512 字节块(默认)。
  • c– 只是字节。
  • w– 两字节字。
  • k– 千字节。
  • M– 兆字节。
  • G– 千兆字节。

按所有者或组查找#

使用-groupor-user选项,我们还可以根据拥有者或所属组来查找目录或文件。例如,下面的代码查找./test所有者所在目录中的所有文件someOwner

find ./test -user someOwner

同样,我们可以像这样按组查找:

find ./test -group someGroup

按权限查找#

使用-perm,我们可以找到具有特定权限组合的所有文件。下面将找到./test目录中所有具有 . 权限的文件0755。如果您想了解有关权限的更多信息,请阅读我们关于 chmod 的文章

find ./test -perm 0755

限制查找命令深度#

由于该find命令是递归的,它有时会返回相当多的结果。如果要限制级别数,请使用该-maxdepth选项。同样,您可以-mindepth在开始返回结果之前定义要到达的最小深度。

find . -name "*.txt" -maxdepth 2

这是一个同时包含-mindepthand的示例-maxdepth,它仅返回./test.

find . -name "*.txt" -maxdepth 2 -mindepth 2

按上次访问/修改时间查找文件#

有许多不同的方法可以根据文件的最后访问或修改时间来查找文件。例如,以下命令将仅查找文件*.txt./test中最近 5 分钟内最后一次访问的文件:

find . -name "*.txt" -amin 5

在这里,-amin指的是文件应该在多少分钟前被访问。以下是检查访问/修改时间的所有选项:

  • -amin n– 该文件的最后一次访问是在 n 分钟前。
  • -atime n– 该文件的最后一次访问是在 n 天前。
  • -cmin n– 文件状态在 n 分钟前更改。
  • -ctime n– 文件状态在 n 天前更改。
  • -mmin n– 该文件最后一次修改是在 n 分钟前。
  • -mtime n– 该文件最后一次修改是在 n 天前。
  • -anewer file– 搜索文件的修改时间比 [FILE] 更新。如果使用-Lor -H,并且 [FILE] 是符号链接,则使用它指向的文件。
  • -cnewer file– 搜索的文件状态比 [FILE] 更改得更近。如果使用-Lor -H,并且 [FILE] 是符号链接,则使用它指向的文件。

如果您添加-daystart到其中任何一个的末尾,则测量将从当天开始进行,而不是当前时间,即以下将查找过去 5 天内修改的任何内容,从当前开始天。此选项在 MacOS 上不可用

find . -name "*.txt" -mmin 5 -daystart

最后,还可以进行修改+-例如,-amin -5将找到最近 5 分钟内修改过的任何内容,但-amin +5会找到超过 5 分钟之前修改过的任何内容。

在 Linux 和 MacOS 中对 find 命令执行命令#

一旦您使用该find命令找到了一些文件或目录,您可能想要对它们执行一些操作。幸运的是,我们可以使用该-exec选项对找到的每个文件或目录运行命令。之后的任何代码-exec都将在找到的每个文件上运行。

例如,下面的命令会将所有找到的文件更改为拥有一个名为someOwner.

find . -name "*.txt" -exec chown someOwner {} \;

\;末尾的只是表示行的结束。{}指的是找到的当前文件 –find将替换找到的每个文件的文件名,因此该命令更加安全。

注意:如果要在目录上执行此操作,请使用-execdir而不是-exec.

在 Linux 和 MacOS 上使用 find 删除文件#

不用说,这应该谨慎使用。find是递归的,您可能会在不知不觉中删除很多您不打算删除的文件。但是,如果要删除使用该find命令找到的文件,可以在代码末尾-delete使用标志。如果你把它放在第一位,它将删除你指定的文件夹中的所有内容。所以要小心。find

以下删除所有格式为的文件*.txt(即带有 .txt 前缀的文件):

find . -name "*.txt" -delete

发表评论

邮箱地址不会被公开。 必填项已用*标注