在Linux上用find命令查找文件和目录的方法

280 阅读3分钟

无论我决心如何组织,似乎总有一些时候,我就是找不到一个文件。有时是因为我首先不记得文件的名字。其他时候,我知道名字,但我想不起我决定把它保存在哪里。甚至有的时候,我需要一个不是我首先创建的文件。不过,无论遇到什么困难,我知道在POSIX系统上,我总是有find

安装find

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

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

通过名称查找文件

你可以通过提供完整的文件名或使用正则表达式的部分文件名,通过其文件名来定位一个文件。find 命令要求提供你要搜索的目录的路径,指定你要搜索的属性的选项(例如,-name 为大小写敏感的文件名),然后是搜索字符串。默认情况下,你的搜索字符串会按字面意思处理。find 命令搜索的文件名正是你在引号之间输入的字符串,除非你使用正则表达式语法。

假设你的文档目录包含四个文件。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 - 命名管线(用于先进先出)
  • 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命令的一个真正有用的前端。