0%

find命令

一、常用用法

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
2
3
4
5
# block节点修改时间60分钟以内
find . -mmin -60

# block节点修改时间60分钟以内,且文件名形如“a*.md”
find . -name 'a*.md' -mmin -60

参考文献: [1]man find
您的支持将鼓励我继续分享!