zzxworld

用案例学习 Linux find 命令的用法

find 命令是 Linux 系统环境下的一个常用命令,用来在指定目录中查找符合要求的文件。find 命令提供了大量灵活的参数,不仅支持按文件后缀查找文件,还能以时间,文件大小,用户或用户组,权限等条件来查找文件或目录。

除了用以查找,find 命令还支持以 -exec 参数接后续命令的方式来对查找到的文件做后续处理。所以这也是一个十分强大且实用的 Linux 命令。今天这篇文章我将以案例的方式来总结一下它的常见用法。

按后缀查找文件

首先,让我们尝试解决一个最常见的需求,查找当前目录下指定后缀的文件有哪些。比如 js 后缀的文件:

find . -name \*.js

如果你不熟悉 Linux 的一些常见规则,这里就对这个命令简单解释一下:

  • find: 自然是命令的名称。
  • .: 这个点是 Linux 的通用符号,代表当前目录。如果是两个点,表示上一级目录。
  • -name: 这是 find 命令的参数,表示指明要按文件名称搜索。
  • \*.js: 这是一个过滤规则,表示任何以 .js 结尾的文件名。前面的 \ 是一个转义符,让系统在执行命令时可以正常的把后面的 * 号传递给 find 命令。如果不习惯这种方式,还可以以 "*.js" 的方式来代替。

不区分大小写查找

让我们继续。默认情况下,find 命令是按大小写来查找的。比如有这样两个文件,a.jsb.JS,用上面的命令,是查找不到 b.JS 的。如果我们不想错过其中任何一个,就需要使用 -iname 参数:

find . -iname \*.js

按类型查找

按类型查找文件的参数为 -type,让我们试试查找当前目录下所有的子目录:

find . -type d

最后的 d-type 参数的类型名称,表示目录类型。这样就可以查找出当前目录下的所有子目录。如果要查找普通的文件,可以使用 f 类型名称。除此之外,-type 还有一个 l 的类型名称,表示链接类型的文件或目录。

按大小查找

-size 是按大小查找文件的参数。比如我们要查找当前目录下大于 10M 的文件,就可以这样使用:

find . -size +10000000

注意前面的 + 号,如果要查找小于 10M 的文件,可以把这个 + 号换成 - 号。

按时间查找

find 命令支持按三种类型的时间来查找文件,它们对应的参数和说明如下:

  • -atime: 文件读取或者访问的时间。
  • -mtime: 文件修改的时间。
  • -ctime: 文件状态变化的时间。

我们同样用例子来演示一下它们的用法。先看看如何查找当前目录下最近一小时内修改过的文件:

find . -mtime -1

后面的 -1 是一个时间度量值,单位是小时。它可以是一个正值,比如 1,它表示 1 小时前。还可以是 +1,它表示一个多小时前。

如果把 -mtime 参数换成 -atime ,那就是按读取访问的时间来搜索。-ctime 类似。

查找结果的后续处理

对于查找到的文件,有时候还需要进行一些后续的处理。find 命令提供的 -exec 参数就可以用来解决这类问题。

比如把当前目录下所有 .log 后缀的日志文件删除掉。就可以这样来处理:

find . -name \*.log -exec rm {} \;

rm 是 Linux 系统的文件删除命令。通过这个例子可以看出,-exec 参数的用法就是在后面接其他相关功能的 Shell 命令来完成后续的文件处理。不过要注意后面两个特殊的字符,它们的解释如下:

  • {}: 这是 find 命令的占位符,表示查找到的文件路径。
  • \;: 这是 -exec 参数的结束符,表示参数后续命令到这里就结束了。

关于 find 命令的使用格式和选项,可以参考下面这篇文章来深入了解和学习。