文件查找是根据文件的各种属性去找到相对应的文件。
文件查找分为实时查找和非实时查找。
非实时查找是根据索引来进行查找;虽然非实时查找查询速度快,但在构建索引时相当占用资源,只有在系统空闲时才能进行,这样有可能会造成索引内容与当前系统中文件的状态不一致的情况,所以查找结果有可能会不准确。
locate属于非实时查找命令,此命令进行模糊查找,所以查找结果并不一定与期望结果一致,如下图:
查询文件名为man5的文件,结果包括重复的目录名man5。
可以使用update命令来手动更新索引内容。
实时查找要遍历所有文件进行条件匹配,所以速度会比较慢,但查找结果精确。
find命令为实时查找命令,下面主要来介绍find的用法。
find使用方法:
find命令会遍历指定目录中的所有文件来完成查找。
格式:
find [option]…[查找路径][查找条件][处理动作]
查找路径:默认为当前目录
查找条件:默认为指定路径下的所有文件
处理动作:默认为显示至屏幕
查找条件:
–name ‘FILENAME’:文件名作精确匹配,支持使用通配符。
*:任意长度的任意字符
?:任意单个字符
[]:指定范围内的任意单个字符
[^]:不包含指定范围内的任意字符
-iname ‘FILENAME’:文件名匹配时忽略大小写
-regex pattern:基于正则表达式进行文件名匹配。
正则表达式要求必须全路径匹配,如下图第一个查找只给出了文件名,没有找到结果;第二个查找给出了完整的查找路径才显示出了结果。
如果是多路径查找可以在路径处做匹配即可,如下图:
-iregex:正则表达式匹配的结果中忽略大小写
-user USERNAME:根据属主查找
-group GROUPNAME:根据属组查找
-uid UID:根据UID查找
-gid GID:根据GID查找
-nouser:查找没有属主的用户
将rrt用户删除后,宿主目录下的属于rrt的文件都变成了无属主文件
-nogroup:查找没有属组的用户
-type:根据文件类型查找
f:普通文件
d:目录
c:字符文件
b:块设备
s:套接字文件
p:命名管道
-size [+|-]#UNIT:根据文件大小查找,默认为字节
常用单位:K,M,G
因为bash不支持浮点数,所以带有小数的文件大小会自动进位,如果查找大小为3k的文件,那么大小范围为2k-3k之间的文件都会显示出来,而小于3k的文件范围为小于等于2k.
#UNIT:#-1 < x <=#
-#UNIT:x<=#-1
+#UNIT:x>#
上例中查找的结果中文件大小都在9k-10k之间
上例中查找结果都是大于10k的目录
上例中的结果都是小于9k的文件。
组合条件
-a:与
-o:或
-not:非
上例中查找/home下属于用户rot的目录
两个条件没有指定逻辑关系时,默认使用“与”
-not A -a -not B = -not(A -o B)
-not A -o -not B = -not(A -a B)
例如: -not \(iname “*r*” -o -user ben \) 表示文件名中不包含r且忽略大小写,并且属主不是ben的文件
根据时间戳查找:
以“天”为单位:
-mtime:文件内容修改时间
-ctime:元数据改变时间
-atime:访问时间
[+|-] #
-atime +5:代表最后一次访问时间大于等于6天前
-atime 5:代表最后一次访问时间在5-6那一天
-atime -5:代表最后一次访问时间小于等于5天内
例如:当前有四个文件分别为a,b,c,d,最后访问时间如下所示:
a 2015-03-17 02:51:37
b 2015-03-15 15:00:00
c 2015-03-10 15:00:00
d 2015-03-13 15:00:00
假如文件a的时间为当前时间,则其它三个文件的时间与a文件相差的天数分别为:b,2天,c,7天,d,4天
上例中当atime=1时所查找的区间为1-2天之间的文件,结果为文件b;atime=-1时查找1天以的文件,结果为文件a;atime=+1时查找大于2天的文件,结果为文件c和文件d。
下图分别查找2天和3天的不同情况,可以结合上面的图示时间表来进行分析
以“分钟”为单位
-mmin
-cmin
-amin
用法上面的情况相同,不再详细说明。
根据权限查找
-perm [/|+|-] MODE 根据权限查找
mode:精确匹配
/mode|+mode:只要有一位匹配即可
-mode:必须包含整个mode才能显示
例如:目前当前目录中的文件的权限如下图所示
查找权限为640的文件
查找权限为包含640中任意一位的文件
查找权限中至少包含640的文件
处理动作:
-print:默认处理动作,显示
-ls:类似ls -l的形式显示每一个文件的详细信息
-ok COMMAND {} \;:每一次操作都需要确认
-exec COMMAND {} \;:执行命令时不需要确认
find一次查找符合条件的所有文件,并一同传递给-ok或-exec后面的命令,但有些命令不能接受过长的参数,此时可以采用下面这种方式来解决:
find | xargs COMMAND 此方式可以逐行处理数据
原创文章,作者:petmaster,如若转载,请注明出处:http://www.178linux.com/1081
评论列表(3条)
文章代码多使用编辑器会使文章整体更专业美关,另: 请标签的添加会使文章的SEO成功率大大提高,
@stanley:好的,谢谢!
以后会注意优化
mark