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
- 使用时,符号链接仅在命令行某处提及时才会被跟踪,即,如果您搜索链接,并且有一个名为链接的符号链接,find 将返回一个链接以及跟随该符号链接时找到的任何内容。
这些选项中的任何一个都可以使用,如下所示:
find -P ./test *.txt
按类型搜索文件
由于有许多不同类型的文件和目录,仅搜索特定字符串并不总是有用的。如果我们想提及我们正在寻找的文件或目录的类型,我们可以使用-type
选项指定它。为了消除歧义,我们还在搜索字符串之前添加了 -name 选项。您也可以完全删除搜索字符串,然后搜索特定的文件类型。
下面,我们搜索类型为 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
由于大小不是正常单位,即 MB、GB、kb,因此可以在下面找到完整的单位列表:
b
- 512 字节块(默认)。c
- 只是字节。w
- 两字节字。k
- 千字节。M
- 兆字节。G
- 千兆字节。
按所有者或组查找
使用-group
or-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
这里是两个-mindepth
and的示例-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
] 更新。如果使用-L
or-H
, and[FILE]
是符号链接,则使用它指向的文件。-cnewer
文件 - 搜索文件状态比[FILE]
. 如果使用-L
or-H
, and[FILE]
是符号链接,则使用它指向的文件。如果您添加-daystart
到其中任何一个的末尾,则测量将从当天开始进行,而不是当前时间,即以下将查找过去 5 天内修改的任何内容,从当前开始日。此选项在 macOS 上不可用。
find . -name "*.txt" -mmin 5 -daystart
最后,还可以进行修改+
。-
例如,-amin -5
将找到最近 5 分钟内修改过的任何内容,但-amin +5
会找到超过 5 分钟之前修改过的任何内容。
在 Linux 和 macOS 中对 Find Command 执行命令
一旦你用 find 命令找到了一些文件或目录,你可能想为它们做点什么。幸运的是,我们可以使用 -exec 选项对找到的每个文件或目录运行命令。-exec 之后的任何代码都将在找到的每个文件上运行。
例如,下面的命令会将所有找到的文件更改为拥有一个名为someOwner
.
find . -name "*.txt" -exec chown someOwner {} \;
\;
末尾的只是表示该行的结束。指的{}
是找到的当前文件 - find 将替换找到的每个文件的文件名,因此该命令更加安全。
注意:如果要在目录上执行此操作,请使用-execdir
而不是-exec
.
在 Linux 和 macOS 上使用 Find 删除文件
不用说,这应该谨慎使用。find 是递归的,您可能会在不知不觉中删除很多您不打算删除的文件。但是,如果要删除使用 find 命令找到的文件,可以在查找代码末尾使用 -delete 标志。如果你把它放在第一位,它将删除你指定的文件夹中的所有内容。所以要小心。
下面将删除所有格式为 *.txt 的文件(即带有 .txt 前缀的文件):
find . -name "*.txt" -delete
文章评论