Linux中在文件系统上查找符合条件的文件,实现工具有locate和find
locate:
1.它是依赖于事先索引构建好的数据库进行查找的。更新它的数据库有两种方式,一种是系统定期自动更新,另一种是执行命令updatedb手动更新数据库。
注意:索引构建过程需要遍历整个根文件系统,极消耗资源
2.它的工作特性:
1.因为是基于数据库实现的,所以查找速度快(实际生产中find也不必locate慢多少)
2.模糊查找,路径中任何一部分包含关键字都显示
3.因为是基于数据库实现的,所以非实时查找。如果新建了一个文件却没有更新数据库,则用locate是找不到的。
3.它的使用方法:
locate [OPTION]…PATTERN…
-b:只匹配路径中的基名,但仍是模糊查找
-c:统计出共有多少个符合条件的文件
-r:基于BRE基本正则表达式来编写模式
例:[root@pxe49 ~]# locate -r “\<passwd$”
/etc/passwd
/etc/pam.d/passwd
/usr/bin/passwd
/usr/share/bash-completion/completions/passwd
find:
1.它是实时查找工具,通过遍历指定起始路径下文件系统层级结构来完成文件查找。
2.它的工作特性:
1.查找速度略慢,但实际生产中服务器配置都很高,所以查找速度并不比locate慢多少。
2.由于每次查找都相当于遍历最新的整个文件系统,所以是精确查找。
3.由于每次查找都相当于遍历最新的整个文件系统,所以又是实时查找。
3.它的使用方法:
find [OPTIONS] [查找起始路径] [查找条件] [处理动作,如删除移动显示]
查找起始路径:指定具体搜索目标起始路径,默认为当前目录
查找条件:指定的查找标准,可以根据文件名(通配),大小,类型,从属关系,权限等等标准进行,默认为找出指定路径下的所有文件
处理动作:对符合查找条件的文件作出的操作,例如删除等操作,默认为输出至标准输出。
find查找条件详解:
1.根据文件名查找:
-name “pattern”
-iname “pattern” //不区分大小写
注:此处的pattern不是正则表达式,是支持glob风格的通配符:*,?,[],[^]
-regex pattern:基于正则表达式模式查找文件,查找方式是根据整个路径(类似于locate),而非基名,很少用到。
2.根据文件从属关系查找:
-user USERNAME:查找属主为指定用户的所有文件
-group GRPNAME:查找属组为指定组的所有文件
-uid UID:查找属主为指定的UID的所有文件
-gid GID:查找属组为指定的GID的所有文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
3.根据文件类型查找:
-type TYPE:
f:普通文件
d:目录文件
l:符号链接文件(软链接文件)
b:块设备文件
c:字符设备文件
p:管道文件
s:套接字文件
4.根据文件的大小查找:
-size[+|-]#UNIT
常用单位:k,M,G
~]find /tmp 174k
#UNIT:(#-1,#]开区间内,准确的说是找到(173k,174k]
-#UNIT:[0,#-1] [0,173k]
+#UNIT:(#,oo) (174,oo)
5.根据时间戳查找:
以“天”为单位:
-atime [+|-]#
#:[#,#-1)
-#:(#,0]
+#:(oo,#-1]
//比如,查找距离现在3天为打开的文件,则实际上是[3,4)天,+#是距今[4,oo]天,-#是距今少于3天
-mtime
[root@localhost ~]# find /etc -mtime -1
-ctime
以“分钟“为单位
-amin
-mmin
-cmin
6.根据权限查找:
-perm[/|-]mode
mode:精确权限匹配
[root@localhost test]# touch a b c d e f g
[root@localhost test]# ll
总用量 0
-rw-r–r–. 1 root root 0 3月 15 21:53 a
-rw-r–r–. 1 root root 0 3月 15 21:53 b
-rw-r–r–. 1 root root 0 3月 15 21:53 c
-rw-r–r–. 1 root root 0 3月 15 21:53 d
-rw-r–r–. 1 root root 0 3月 15 21:53 e
-rw-r–r–. 1 root root 0 3月 15 21:53 f
-rw-r–r–. 1 root root 0 3月 15 21:53 g
[root@localhost test]# chmod 640 a
[root@localhost test]# chmod 666 b
[root@localhost test]# chmod 440 c
[root@localhost test]# chmod 775 d
[root@localhost test]# chmod 777 e
[root@localhost test]# ll
总用量 0
-rw-r—–. 1 root root 0 3月 15 21:53 a
-rw-rw-rw-. 1 root root 0 3月 15 21:53 b
-r–r—–. 1 root root 0 3月 15 21:53 c
-rwxrwxr-x. 1 root root 0 3月 15 21:53 d
-rwxrwxrwx. 1 root root 0 3月 15 21:53 e
-rw-r–r–. 1 root root 0 3月 15 21:53 f
-rw-r–r–. 1 root root 0 3月 15 21:53 g
[root@localhost test]# find ./ -perm 644 -ls
2230844 0 -rw-r–r– 1 root root 0 3月 15 21:53 ./f
2230845 0 -rw-r–r– 1 root root 0 3月 15 21:53 ./g
/mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足。(用于找至少有一个用户有某个权限的) 存在或者的关系。即9位权限有1位符合就OK
find ./ -perm /222 -ls,查找至少有一类用户有写权限
find ./ -perm /111 -ls,查找至少有一类用户有可执行权限
find ./ -perm /001 -ls,查找其他用户是否有可执行权限
-mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足。
find ./ -perm -222 -ls //查找每一类用户都有w权限
find ./ -not -perm -222 -ls//至少有一个用户没有w权限
注意:出现0表示不管它
find ./ -perm /002 -ls
find ./ -perm -002 -ls 它们是一样的。
组合测试(加在两个查找条件之间)(将多个条件以与或非连接起来):
与:-a,与是默认组合逻辑
或:-o,
非:-not,!
例:~]# find /tmp -not -type f -ls //查找tmp目录下的非普通文件并显示。
[root@localhost ~]# find /etc -name “passwd” //查找etc目录下基名为passwd的文件。
/etc/pam.d/passwd
/etc/passwd
德摩根定律:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
find处理动作详解:
-print:将查找到的文件的路径输出至标准输出,默认的动作
-ls:类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息
-delete:删除查找的文件,危险操作,请勿尝试
-fls /PATH/TO/SOMEFILE:把查找到的所有文件的长格式(详细)信息保存至指定文件中
-ok COMMAND {} \; (固定格式): 对查找到的每个文件执行由COMMAND表示的命令,每次操作都由用户确认
-exec COMMAND{} \; :对查找到的每个文件执行由COMMAND表示的命令,不与用户交互。
find ./ -perm /002 -exec mv {} {}.danger \;
注意:{}表示你查找到的文件的文件名。
上一条命令表示将找到的权限为/002的文件的文件名后面加上.danger
注意:find传递查找到的文件路径至后面的命令时,是查找出所有符合条件的文件路径,并一次性传递给后面的命令。但是有些命令不能接受过长的参数,此时命令执行会失败。另一种方式可规避此问题。用xargs
find | xargs COMMAND 通过管道送给xargs,由xargs调用命令!
原创文章,作者:3,如若转载,请注明出处:http://www.178linux.com/73050
评论列表(2条)
详细介绍了linux系统下的查找类(locate,find)命令的使用,内容介绍的非常详细,但需要注意一下排版问题。
@renjin:Good point. I hadn’t thhugot about it quite that way. :)