使用 find 命令在 Linux 上查找文件和目录

有很多理由学习 find 命令,所以请下载我们的免费 find 命令速查表来帮助您更多地了解该命令。
60 位读者喜欢这篇文章。
How to find files in Linux

Lewis Cowles, CC BY-SA 4.0

无论我下定决心要多么有条理,似乎总会有找不到文件的时候。 有时是因为我根本不记得文件的名称。 其他时候,我知道名称,但不记得我决定将它保存在哪里。 甚至有时候我需要的文件根本不是我创建的。 但是,无论什么难题,我知道在 POSIX 系统上,我始终可以使用 find 命令。

安装 find

find 命令由 POSIX 规范定义,该规范创建了衡量 POSIX 系统(包括 Linux、BSD 和 macOS)的开放标准。 简而言之,只要您运行的是 Linux、BSD 或 macOS,您就已经安装了 find

但是,并非所有的 find 命令都完全相同。 例如,GNU find 命令具有 BSD 或 Busybox 或 Solaris find 命令可能没有或具有但实现方式不同的功能。 本文使用来自 findutils 软件包的 GNU find,因为它很容易获得并且非常流行。 本文中演示的大多数命令都适用于 find 的其他实现,但是如果您在 Linux 以外的平台上尝试某个命令并获得意外结果,请尝试下载并安装 GNU 版本。

按名称查找文件

您可以通过提供完整的文件名或使用正则表达式的文件名部分来按文件名查找文件。 find 命令需要您要搜索的目录的路径,指定要搜索的属性的选项(例如,-name 用于区分大小写的文件名),然后是搜索字符串。 默认情况下,您的搜索字符串被视为字面字符串:除非您使用正则表达式语法,否则 find 命令会搜索与您在引号之间输入的字符串完全相同的文件名。

假设您的 Documents 目录包含四个文件:Foofoofoobar.txtfoo.xml。 这是一个按名称“foo”进行字面搜索的示例:

$ find ~ -name "foo"
/home/tux/Documents/examples/foo

您可以使用 -iname 选项使其不区分大小写,从而扩大搜索范围:

$ find ~ -iname "foo"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo

通配符

您可以使用基本的 shell 通配符来扩大搜索范围。 例如,星号 (*) 代表任意数量的字符:

$ find ~ -iname "foo*"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt

问号 (?) 代表单个字符:

$ find ~ -iname "foo*.???"
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt

这不是正则表达式语法,因此在此示例中,点 (.) 代表字面点。

正则表达式

您也可以使用正则表达式。 与 -iname-name 一样,也有区分大小写和不区分大小写的选项。 但是,与 -name-iname 选项不同,-regex-iregex 搜索应用于整个路径,而不仅仅是文件名。 这意味着如果您搜索 foo,您将不会得到任何结果,因为 foo 不匹配 /home/tux/Documents/foo。 相反,您必须搜索整个路径,或者在字符串的开头使用通配符序列:

$ find ~ -iregex ".*foo"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo

查找最近一周内修改的文件

要查找您最近一周修改的文件,请使用 -mtime 选项以及过去的(负数)天数:

$ find ~ -mtime -7
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt

查找在一定天数范围内修改的文件

您可以组合 -mtime 选项以在一定天数范围内查找文件。 对于第一个 -mtime 参数,请提供您可能修改文件的最近天数,对于第二个参数,请给出最大天数。 例如,此搜索查找修改时间超过过去一天但不超过七天的文件:

$ find ~ -mtime +1 -mtime -7

按文件类型限制搜索范围

通常可以通过指定您要查找的文件类型来优化 find 的结果。 如果您不确定要查找什么,则不应使用此选项,但是如果您知道您要查找的是文件而不是目录,或者要查找目录而不是文件,那么这可能是一个很好的过滤器。 该选项是 -type,其参数是一个字母代码,代表几种不同的数据类型。 最常见的是:

  • d - 目录
  • f - 文件
  • l - 符号链接
  • s - 套接字
  • p - 命名管道(用于 FIFO)
  • b - 块特殊文件(通常是硬盘驱动器指定)

以下是一些示例:

$ find ~ -type d -name "Doc*"
/home/tux/Documents
$ find ~ -type f -name "Doc*"
/home/tux/Downloads/10th-Doctor.gif
$ find /dev -type b -name "sda*"
/dev/sda
/dev/sda1

调整范围

find 命令默认是递归的,这意味着它会在目录中包含的目录的目录中搜索结果(依此类推)。 这在大型文件系统中可能会让人不知所措,但是您可以使用 -maxdepth 选项来控制您希望 find 深入到文件夹结构的深度:

$ find /usr -iname "*xml" | wc -l
15588
$ find /usr -maxdepth 2 -iname "*xml" | wc -l
15

您也可以使用 -mindepth 设置最小递归深度:

$ find /usr -mindepth 8 -iname "*xml" | wc -l
9255

下载速查表

本文仅涵盖 find 的基本功能。 它是搜索系统的强大工具,但它也是强大的 Parallel 命令的非常有用的前端。 有很多理由学习 find,所以下载我们的免费 find 速查表,以帮助您更多地了解该命令。

接下来阅读什么
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。 他曾在电影和计算行业工作,通常是同时进行。

3 条评论

你好。

只是一个问题,在搜索目录的示例中,是否应该

find ~ -type d -name "Doc*"

也添加 -name 选项?

问候!

很好的发现,谢谢。 已更新!

回复 作者 victorhck

很高兴! ;)

我已经将它翻译/改编成西班牙语供我的博客使用(当然,提到了原始来源和作者!)

https://victorhckinthefreeworld.com/2021/09/10/el-comando-find-de-gnu/

玩得开心!!

回复 作者 sethkenlon

Creative Commons License此作品根据 Creative Commons Attribution-Share Alike 4.0 International License 授权。
© . All rights reserved.