无论我多么决心保持井井有条,似乎总有找不到文件的时候。有时是因为我根本不记得文件的名称。有时,我知道名称,但我不记得我决定将它保存在哪里。甚至有时我需要一个我一开始没有创建的文件。但是,无论遇到什么难题,我都确信在 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 目录包含四个文件:Foo
、foo
、foobar.txt
和 foo.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
速查表,以帮助您了解更多关于该命令的信息。
3 条评论