每天一个 Linux 命令(1)—— find

704 阅读3分钟

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

前言

Linux 中的 find 命令主要用于检索系统中的文件,以指定的条件表达式(文件名、文件大小及文件修改日期等文件属性)为匹配准则,从指定的目录开始,逐层深入各级子目录,递归地检索匹配表达式的所有文件,同时还可以继续执行指定命令。今天我们来学习一下 find 命令如何使用。

参数介绍

首先我们通过 find --help 命令查看 find 命令的参数以及各个参数的含义。


$ find --help

Usage: find [-H] [-L] [-P] [-Olevel] [-D debugopts] [path...] [expression]

-H-L-P 选项主要用于控制如何处理符号链接文件。如果存在,必须出现在第一个路径名之前。紧随其后的 path 是需要考察的目录,作为文件检索的起点。目录路径名后面的 expression 是选择表达式,用于指定各种匹配准则或检索条件。

日常工作中我们很少使用 -H-L-P 等参数,我们来简化一下这个命令:


find path -options[-print][-exec][-ok][...]

  • pathname:查找的目录路径;

  • -print:将匹配的文件输出到标准输出;

  • -exec:待执行命令;

命令选项

  • -name:通过文件名查找文件;

  • -prune:通过文件权限来查找文件;

  • -group:通过文件所属的组来查找文件;

  • -mtime -n +n:按照文件的更改时间来查找文件,-n 表示文件更改时间距现在 n 天以内,+n 表示文件更改时间距现在 n 天之前。

  • -atime:使用同 -mtime,表示访问时间;

  • ctime:使用同 -mtime,表示创建时间;

  • -nogroup:查找无有效所属组的文件,即该文件所属的组在 /etc/group 中不存在;

  • -nouser:查找无有效属主的文件,即该文件的属主在 /etc/passwd 中不存在;

  • -type:查找某一类型的文件,诸如:

  • b:块设备文件

  • d:目录

  • c:字符设备文件

  • p:管道文件

  • l:符号链接文件

  • f:普通文件

  • -follow:如果 find 命令遇到符号链接文件,就跟踪至链接所指向的文件;

-exec 参数

find 命令不仅支持查找命令,查找完成之后还可以支持其它操作,比如删除等。这就需要 -exec 参数了。

-exec 参数后面跟的是 command 命令,它的终止是以 ; 为结束标志的,所以这句命令后面的分号是必不可少的。考虑到各个系统中分号会有不同的意义,所以前面加反斜杠,{} 花括号代表前面 find 命令查找出来的文件名。

在使用 find 命令是,只要把想要的操作写在一个文件里,就可以用 -exec 来配合使用。在有些操作系统中只允许 -exec 选项执行诸如 lsls -l 这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行 rm 命令删除文件之前,最好先用 ls 命令看一下,确认它们是所要删除的文件。 exec 选项后面跟随着所要执行的命令或脚本,然后是一对 {},一个空格和一个 \ ,最后是一个分号。为了使用 exec 选项,必须要同时使用 print 选项。如果验证一下 find 命令,会发现该命令只输出从当前路径起的相对路径及文件名。

实际用例

  1. 查找指定时间内修改过的文件

find -mtime -2

  1. 根据关键字查找

find . -name "*.log"

  1. 按照目录或文件的权限来查找文件

find /User/ -perm 777

  1. 按类型查找

find . -type f -name "*.log"

  1. 从 /home 目录开始,检索并删除其中的所有 core 文件

find /home -name core -type f -exec /bin/rm '{}' \;

参考文档