find命令的「七种武器」

Linux find命令用来在指定目录下查找文件.
任何位于参数之前的字符串会被作为将要查找的目录.
通过find命令,我们可以方便的操作Linux下的各种目录和文件信息,是Linux使用者常用的命令之一.

find命令使用极为频繁,而且使用方法多种多用,参数繁多,这里根据常用的一些条件列出7种常用的使用方法。

1. 按照名称查找

按照名称查找是最常用的方法之一,也是最简单的方法。可以通过文件名或者是正则表达式的文件名进行文件的搜索。

find ./logs -name log.20220623   # 在logs目录下检索名字为log.20220623的文件/文件夹
find ./logs ! -name log.20220623   # 反向查找,检索除了log.20220623之外的所有文件/文件夹
find ./logs -name "log*"    # 正则表达式查找,检索所有符合“log*”的文件/文件夹

按照名称查找.png
find命令可以通过-name <样式>对指定路径中符合样式的文件或者是文件夹进行查找,<样式>可以是一个具体的文件名字,也可以是正则表达式,极大的方便了查找过程。
而且,在使用-name参数时还可以通过!进行方向查找,可以过滤需要保留的信息。

2. 按照文件类型查找

从上面的查找结果中可以看到, 除了列出了符合条件的文件之外,还会列出当前文件夹的名字,但是如果你需要在find命令后面通过管道符|增加针对文件的具体操作的话,被列出来的文件夹可能会成为一个阻碍。这个问题也可以简单的通过-type参数进行解决。
-type参数可以通过指定文件类型,从而只对指定类型的文件进行检索。

  • f 普通文件
  • l 符号连接
  • d 目录
  • c 字符设备
  • b 块设备
  • s 套接字
  • p FIFO

按照文件类型进行查找.png
你看,增加了文件类型参数说明后,find结果中显示的就只有普通的文件了,文件夹的信息已经被过滤了。

3. 按照文件时间戳进行查找

随着工作时长的增加,你的电脑上的内容肯定会越来越多,尤其是一些例行化的日志文件,当你需要对日志信息进行清理的时候,时间便是一个很好的帮手,那么该怎么通过时间戳信息对文件进行过滤呢?
find命令中可以通过UNIX/Linux文件系统中三种不同的时间戳对文件进行操作和查找:

  • 访问时间(-atime/天,-amin/分钟):用户最后一次访问该文件的时间
  • 修改时间(-mtime/天,-mmin/分钟):文件最后一次被修改的时间
  • 变化时间(-ctime/天,-cmin/分钟):文件元数据(所有权、位置、文件类型、权限设置等信息)最后一次被修改的时间。

使用这类参数的时候,需要注意命令的详细配置。
具体时间长度分成三种使用规范:

find ./logs -type f -mmin 2     # 检索修改时间距离现在正好2min的文件
find ./logs -type f -mmin +2    # 检索修改时间距离现在超过2min的文件
find ./logs -type f -mmin -2    # 检索修改时间距离现在小于2min的文件

按照文件时间戳进行查找.png

4. 按照所有者查找

这个功能很简单,就是通过-user对文件的所有用户进行指定,过滤指定用户创建的文件。

find ./logs -type f -user zhang

5. 按照目录层级检索

当你要检索的路径存在多级目录的时候,你可以通过-maxdepth参数指定你需要检索的目录层级数目,减少不必要的检索过程。

find ./logs -type f -name 'log.*' -maxdepth 1   # 在第一级目录中检索文件,没有显示./logs/logs1/下的文件
find ./logs -type f -name 'log.*' -maxdepth 2   # 在第一、第二级目录中检索文件,显示了./logs/logs1/下的文件

按照目录层级检索.png

6. 按照文件大小检索

当你需要对占用空间较大的文件进行处理或者是检索大量的小文件的时候,-size参数就是派上用场的时候了。
-size参数可以根据文件的大小进行配置,使用方法和根据时间检索类似,可以根据指定文件大小范围进行检索。
可以使用的文件大小单位:

  • b:块(512字节)
  • c:字节
  • w:字(2字节)
  • k:1024字节
  • M:1024k
  • G:1024M
    按照文件大小检索.png

7. 按照检索之后执行命令

对文件检索结束后通常需要对结果进行进一步的操作,这个时候可以使用| xargs的命令,同样也可以使用find自带的exec参数。

  • 将指定的文件进行删除:
    find ./logs -type f -size +1c -exec rm {} \;
  • 将30天之外的文件移动到old目录中
    find ./logs -type f -mtime +30 -exec cp {} old \;

当然,你也可以通过ok进行上述操作,他和exec的区别主要在于他会给出提示,来确定是否继续进行响应的操作。

find ./logs -type f -mtime +30 -ok rm {} \;

8. 结语

上面列出来的其中find命令常用的操作,是我在日常使用中用的比较多的,但是绝不是仅仅意味着find只有这七种操作,find的操作有很大的自由度,大家需要的时候可以自行检索。


find命令的「七种武器」
https://zermzhang.github.io/2022/06/23/linux/find命令的「七种武器」/
作者
知白
发布于
2022年6月23日
许可协议