这是我参与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 选项执行诸如 ls 或 ls -l 这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行 rm 命令删除文件之前,最好先用 ls 命令看一下,确认它们是所要删除的文件。 exec 选项后面跟随着所要执行的命令或脚本,然后是一对 {},一个空格和一个 \ ,最后是一个分号。为了使用 exec 选项,必须要同时使用 print 选项。如果验证一下 find 命令,会发现该命令只输出从当前路径起的相对路径及文件名。
实际用例
- 查找指定时间内修改过的文件
find -mtime -2
- 根据关键字查找
find . -name "*.log"
- 按照目录或文件的权限来查找文件
find /User/ -perm 777
- 按类型查找
find . -type f -name "*.log"
- 从 /home 目录开始,检索并删除其中的所有 core 文件
find /home -name core -type f -exec /bin/rm '{}' \;