绪论
find命令是Unix系统中最为古老与复杂的命令之一,它功能强大,可以根据不同的标准在任何位置搜索任何文件。
find命令的基本思想即搜索一个或者多个目录树,根据用户指定的测试条件,查找符合特定标准的文件。当查找完成之后,find命令将对查找到的文件执行指定的操作。这些操作可简可繁,简单的例如仅输出文件名;复杂的例如删除文件、将搜索结果传递给另一个命令。在使用find命令时,用户需要提供3类信息,分别为目标路径、测试条件以及操作。find命令的基本如下所示:
find path test action
其中,path参数表示目标路径,用户可以同时指定多个路径,路径之间用空格隔开。test参数表示测试条件;同样,用户可同时指定多个测试条件,它们之间用空格隔开;action参数则表示对于搜索结果要执行的操作,如果有多个操作,则它们之间同样使用空格隔开。
find命令的工作流程如下所示:
(1)搜索所有用户指定的路径,包括所有的子目录
(2)对于遇到的每个文件,检查是否符合用户指定的条件。在该步骤中,所有符合条件的文件形成一个列表。
(3)对于结果列表中的每个文件,执行用户指定的操作。
如下为一个find命令的简单应用实例
find / -name ls -print
在该应用实例中,目标路径为根目录,表示在当前系统的所有的目录及其子目录中进行搜索。测试条件为-name ls,表示搜索文件名为ls的文件。操作为-print,表示将搜索到的文件名打印出来。
find命令的目标路径
find命令的路径参数表示在何处搜索指定的文件。通常情况下,路径都是一个目录名,用户可以使用相对路径、绝对路径,以及简写形式来指定路径,如下所示。
find /usr/bin
find /
find .
find -root
以一个示例脚本为例。该脚本文件的作用是在当前路径下搜索扩展名为.sh的文件并输出结果。
#! /bin/bash
files=`find . -name ".sh"`
echo "$files"
find命令的测试条件
常见的测试条件
find命令的测试条件用于对搜索结果进行筛选,只有符合筛选条件的文件才会出现在最终的搜索结果中。下表为部分常用的测试条件。
条件 | 说明 |
---|---|
-name pattern | 表示包含指定匹配模式的文件名 |
-iname pattern | 表示包含指定匹配模式的文件名,该条件不区分字母大小写 |
-type | 指定文件类型,可以取f和d两个值,分别表示普通文件和目录 |
-perm mode |
匹配其权限被设置为指定mode的文件 |
-user userid | 匹配其所有者为指定用户ID的文件 |
-group groupid | 匹配其所有者的组着为指定组ID的文件 |
-size size | 匹配其大小为size的文件夹 |
-empty | 匹配空文件 |
需要注意的是,在-type选项中,除了f和d,还可选择c表示字符设备,b表示块设备,p表示管道,l表示链接。
在find测试条件汇总,-name与-type是最为常用的,使用方法如下所示。
#! /bin/bash
files=`find /etc -type f -print | wc -l`
directories=`find /etc -type d -print | wc -l`
echo "There are $files regular files in /etc directory."
echo "There are $directories directories om /etc directory."
此外,方括号“[]”是一种非常有用的通配符,用户可将一系列的字符放在方括号中,find命令会匹配方括号中的任意一个字符,例如:
root@main:~# find /etc -name "rc[1-9].d" -print
/etc/rc3.d
/etc/rc1.d
/etc/rc5.d
/etc/rc2.d
/etc/rc6.d
/etc/rc4.d
使用!运算符对测试条件取反
find命令提供一个感叹号运算符!,用来对测试条件进行取反。!符号可以加在任何测试条件前,表示气候测试的相反条件。在使用!运算符的时候,需要在!符号的左右各留一个空格。
find命令的动作
常用的find动作命令
默认动作,将搜索结果写入到标准输出 | |
-fprint file | 与-print相同,但是将搜索结果写入到文件file |
-ls | 以详细格式(长格式)显示搜索结果 |
-fls file | 同-ls,但是将搜索结果写入都文件file |
-delete | 将搜索到的文件删除 |
-exec command {} \; | 查找并执行命令,{}表示搜索到的文件名 |
-ok command {} \; | 查找并执行命令,但是需要用户确认 |
用户在使用-delete命令的时候需要注意的是该动作不会给出任何确认提示;-exec使find命令对搜索结果中的文件执行指定的Shell命令,相应的Shell命令的语法为:
`command` {} \;
其中command表示Shell命令,花括号{}表示索索结果中的文件名,最后的分号表示命令的结束。需要注意的是最后的分号需要 反斜杠来转义。此外,分号与花括号之间有一个空格;-ok与-exec的作用相同,但是在执行每一个命令之前,都会给出提示让用户确定是否执行。