一、常用用法
1 | find path [-maxdepth N] test |
二、含义与选项
2.1、含义
在指定路径下,找到符合条件的文件和目录。
2.2、选项
“path”:表示查找范围的路径。
“-maxdepth N”:表示查找的最深深度为N层。
“test”:需要满足的条件。
三、常用的test
3.1、关于文件时间的几个test
介绍关于文件时间的几个test,见表1。
表1
test | 说明 |
---|---|
-amin n | 以最后访问文件block节点中数据的时间为判断依据,以多少个分钟为单位 |
-atime n | 以最后访问文件block节点中数据的时间为判断依据,以多少个24小时为单位 |
-cmin n | 以最后修改文件inode节点中数据的时间为判断依据,以多少个分钟为单位 |
-ctime n | 以最后修改文件inode节点中数据的时间为判断依据,以多少个24小时为单位 |
-mmin n | 以最后修改文件block节点中数据的时间为判断依据,以多少个分钟为单位 |
-mtime n | 以最后修改文件block节点中数据的时间为判断依据,以多少个24小时为单位 |
一点说明:
1、在以上6个选项中,数字“n”有3种形式,分别是:n,+n,-n
为了更加透彻完整地理解,可以查看FindUtils包中的“find命令”源代码,经过查看源代码(主要是“pred.c”文件中的pred_timewindow
函数),可以归纳得到如下结论。
在以下描述中,系统当前时间(NowTime)和文件相应维度的时间(FileTime)都表示成以秒为单位;在以“多少个分钟”为单位的选项中,UNIT=60
(1分钟有60秒),在以“多少个24小时”为单位的选项中,UNIT=24*60*3600
(24小时有24*60*3600秒);加了“-daystart”选项后,NowTime就变为当日午夜时间。
3.1.1、以“多少个分钟”为单位的选项
“n”和“-n”的情况具有一定的重复区域,即某个时刻“n”能够找到某个文件,“-n”也能够找到相同的文件。
1、第一种情况“n”为“n”
1 | NowTime-FileTime >= (n-1)*UNIT && NowTime-FileTime < n*UNIT |
2、第二种情况“n”为“+n”
1 | NowTime-FileTime > n*UNIT |
3、第三种情况“n”为“-n”
1 | NowTime-FileTime < n*UNIT |
3.1.2、以“多少个24小时”为单位的选项
1、第一种情况“n”为“n”
1 | NowTime-FileTime >= n*UNIT && NowTime-FileTime < (n+1)*UNIT |
2、第二种情况“n”为“+n”
1 | NowTime-FileTime > (n+1)*UNIT |
3、第三种情况“n”为“-n”
1 | NowTime-FileTime < n*UNIT |
注意,这里没有“n+1”,避免了“n”和“-n”情况的重复区域。
3.1.3、举例说明
假设系统当前时间为2015-06-09 13:35:50
。
1、例子1
那么find . -amin 10
命令,查找的文件的“atime”范围:2015-06-09 13:25:51 -- 2015-06-09 13:26:50
。
2、例子2
那么find . -amin -10
命令,查找的文件的“atime”范围:2015-06-09 > 13:25:50
(因此,2015-06-09 13:26:30
既能通过-amin 10
得到,也能通过-amin -10
得到)。
3、例子3
那么find . -amin +10
命令,查找的文件的“atime”范围:2015-06-09 < 13:25:50
。
4、例子4
那么find . -atime 5
命令,查找的文件的“atime”范围:2015-06-03 13:35:51 -- 2015-06-04 13:35:50
。
5、例子5
那么find . -atime -5
命令,查找的文件的“atime”范围:2015-06-04 > 13:35:50
。
6、例子6
那么find . -atime +5
命令,查找的文件的“atime”范围:2015-06-03 < 13:35:50
。
3.2、关于文件权限的test
介绍如表2。
表2
test | 说明 |
---|---|
-perm mode | 目标文件的权限跟“mode”一致 |
-perm -mode | 目标文件的权限包含了“mode” |
-perm /mode | 目标文件的权限跟“mode”有交集 |
3.3、关于文件类型的test
关于文件类型的test为“-type c”,其中“c”表示文件类型特征码,对于文件类型特征码的介绍如表3所示。
表3
文件类型特征码 | 说明 |
---|---|
b | block (buffered) special |
c | character (unbuffered) special |
d | directory |
p | named pipe (FIFO) |
f | regular file |
l | symbolic link; this is never true if the -L option or the -follow option is in effect, unless the symbolic link is broken. If you want to search for symbolic links when -L is in effect, use -xtype |
s | socket |
D | door (Solaris) |
3.4、关于文件所属用户的test
“-user uname”:表示属于“uname”这个用户的文件,“uname”可以是“用户名称”,也可以是“用户ID,即UID”。
3.5、关于文件所属用户组的test
“-group gname”:表示属于“gname”这个用户组的文件,“gname”可以是“用户组名称”,也可以是“用户组ID,即GID”。
3.6、关于文件名称的test
“-name ‘pattern’”:文件名(去掉前导目录)匹配“pattern”这个通配符模式表达式的文件。使用的通配符模式表达式是一个特定的变种,但主要的语法还是可以参考《Linux Shell通配符模式表达式》。有一点跟Linux Shell通配符模式表达式不一样,本通配符模式表达式变种中,“通配符”,“字符类”,“字符范围”可匹配文件名的开头“.”字符,比如有文件“.a.txt”,find . -name '*.txt'
命令,find . -name '?a.txt'
命令,find . -name '[.]a.txt'
命令,find . -name '[!a]a.txt'
命令,find . -name '[!a-z]a.txt'
命令都可匹配到该文件。
四、其他
“find”命令的完整定义:
1 | find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression] |
1、我们在使用“find”命令的时候,一般不解析遇到的软符号链接文件,如果解析的话很容易造成递归死循环,一般也不使用调试和优化选项,因此“-H”,“-L”,“-P”,“-D”,“-O”这些选项不使用
2、“expression”包括了“options”,“tests”,“actions”,以及它们之间的“operators”这四个部分。“options”一般没有什么用(除了“-maxdepth”这个“option”),“actions”比较复杂,因而我们可以选择先使用简单的“find”命令,找出符合条件的文件,然后再通过管道或者脚本的方式进行操作,作为连接用的“operators”也就不被使用;只剩下“tests”
3、因此,最终“-H”,“-L”,“-P”,“-D”,“-O”,“expression”中的“options”,“actions”,“operators”都不需要
五、例子
1 | # block节点修改时间60分钟以内 |
参考文献: [1]man find