Linux 文件查找:locate、find

前言

Linux 秉承着“一切皆文件”的哲学思想,当然这也是对 Linux 文件系统的一种抽象说法,从设备驱动程序、目录、系统配置、内核参数到任务进程都是用文件来表示的。其中的任何事物,无论是纯文本文件(例如:/etc/hosts)、块设备或字符设备驱动程序

相关命令

locate命令

locate命令用来查找文件或目录。localte命令要比find命令快的多,原因在于它不搜索具体目录,而是搜索一个事先构建的数据库
/var/lib/mlocate/mlocate.db
。这个数据库中含有本地所有文件信息。Linux系统会自动创建这个数据库,并且每天自动更新一次,因为,我们在用whereis和locate查找文件时,有时会找到已经被删除的数据,或者刚刚建立的文件无法找到,原因就是数据库文件没有被更新。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。

整个locate工作其实是四部分组成的:
1、/usr/bin/updatedb    主要用来更新数据库,通过 crontab 自动完成的
2、/usr/bin/locate   查询文件位置
3、/etc/updatedb.conf   updatedb的配置文件
4、/var/lib/mlocate/mlocate.db   存放文件信息的文件(数据库文件)

工作特性:
	查找速度快
	模糊查找
	非实时查找

用法:locate [OPTION]... PATTERN...
选项:
	-b:只匹配路径中的基名
	-c:统计出共有多少个符合条件的文件
	-r:可以用基本正则表达式来编写PATTERN

	注意:updatedb 更新数据库是非常消耗资源的
		 数据库构建过程需要遍历整个根文件系统,极消耗资源

find命令

工作方式:实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找
工作特点:
	1、查找速度略慢
	2、精确查找
	3、实时查找

用法:find [OPTIONS]... [查找路径] [查找条件] [处理动作]

查找起始路径:指定具体搜索目标起始路径;默认为当前目录
查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等等标准进行,默认为找出指定路径下的所有文件
处理动作:对符合条件的文件作出的操作;例如删除等操作,默认为输出至标准输出


查找条件:
	表达式:由选项和测试组成
	测试的实现:结果通常为布尔型(结果要么为真要么为假)


根据文件名查找:
	-name "PATTERN":查找文件名为PATTERN的文件
	-iname "PATTERN":忽略大小写查找文件名为PATTERN的文件
	支持glob风格的通配符:
		*,?,[],[^]等

	-regex "PATTERN":基于正则表达式模式查找文件,匹配范围为整个路径
	-iregex "PATTERN":基于正则表达式查找文件,匹配范围为整个路径,而非其名字,忽略大小写

根据文件从属关系查找:
	-user USERNAME:查找属主为指定用户的所有文件(包括目录)
	-group GROUPNAME:查找属组为指定组的所有文件(包括目录)
	-uid UID:查找属主为指定UID的所有文件(包括目录)
	-gid GID:查找属组为指定GID的所有文件(包括目录)
	-nouser:查找没有属主的文件
	-nogroup:查找没有属组的文件

根据文件类型查找:
	-type TYPE
		f:普通文件
		d:目录
		c:字符设备文件
		l:符号链接文件(软链接)
		p:管道文件
		s:套接字文件
		b:块设备文件


组合测试:
	与:-a,默认组合逻辑(需要所有条件都满足)
		示例:find /tmp -nouser -a -type f -ls
	或:-o(只要符合其中一个条件就可以满足)
	非:-not
	!A -a !B = !(A -o B)
	!A -o !B = !(A -a B)


根据文件的大小查找:
	-size [ + | - ]#UNIT(单位)
		常用单位:k,m,G
	#UNIT:(#-1,#)
	-#UNIT:(0,#-1)
	+#UNIT:(#,oo)不包含#,只能大于#


根据时间戳查找:
	以“天”为单位
		-atime [ + | - ]#:访问时间
			#:[#,#-1]
			-#:表示#天之内访问过的文件(#,0)
			+#:表示#天之外访问过的文件(#-1,oo)
		-mtime:修改时间
		-ctime:改变时间
	
	以“分钟”为单位
		-amin
		-mmin
		-cmin


根据权限查找:
	-perm [ / | -]MODE
		MODE:精确权限查找
		/MODE:任何一类用户(u,g,o)的权限中任何一位(r,w,x)符合条件即可满足,9位权限之间存在“或”关系
		-MODE:任何一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即可满足,9位权限之间存在“与”关系


处理动作:
	-print:输出至标准输出(默认动作)
	-ls:类似于查找到文件执行“ls -l”命令;输出文件的详细信息
	-delete:删除查找到的文件
	-fls /PATH/TO/SOMEFILE:将查找到的所有文件的长格式信息保存至指定的文件中
	-ok COMMAND {} \; :对查找到的每个文件执行由COMMAND表示的命令,每次由用户确认
	-exec COMMAND {} \; :对查找到的每个文件执行由COMMAND表示的命令,不需要每次由用户确认

	注意:{}是引用文件名的
	find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次传递给后面的命令;但是有些命令不能接受过长的参数,此时命令执行会失败;另一种方式可规避此问题
	find | xargs COMMAND

对find权限查找的进一步理解

find命令按文件权限查找,需要用到 -perm 选项。-perm 选项的基本用法很简单,格式为“-perm mode”,其中 mode 为所要匹配的权限,这种查找方式实现的是精确匹配。
例如,要在 /boot 目录中查找权限位 755 的普通文件,并显示详细信息。我们设置查找条件为“-perm 755”,可以发现共找到两个文件,这两个文件的权限都对查找条件进行了精确匹配。

[root@localhost ~]# find /boot -perm 755 -type f -ls
 65030  250 -rwxr-xr-x   1 root     root       254248 4月  7  2015 /boot/efi/EFI/redhat/grub.efi
    16 4125 -rwxr-xr-x   1 root     root      4222192 7月  2  2015 /boot/vmlinuz-2.6.32-573.el6.x86_64

但在更多情况下,我们希望能够对权限进行模糊匹配。比如查找所属组具有写权限的目录,或者是查找其他用户具有写权限的文件等。在这些情况下,我们只关心所属组或其他用户是否有相应的权限,而不关心整体权限,因而这时使用精确匹配就无法满足要求了。
-perm 选项提供了两种模糊匹配的方式“-perm /mode”和“-perm -mode”。这两种模糊匹配方式不是很好理解,下面先举例说明它们之间的区别。
比如我们查找的权限为“220”。如果用字符的形式来表示权限的话,应该是“-w–w----”。如果用二进制的形式来表示的话,应该是“010010000”。如图所示:
在这里插入图片描述
这里重点参考采用二进制形式表示的权限,其中数字为 0 表示忽略相应位置的权限,数字 1 表示匹配相应位置的权限,因而采用“220”作为权限查找条件进行模糊匹配时,就表示要求所有者和所属组具有写权限,而对其它的权限则予以忽略。
理解了这点之后,“-perm /mode”和“-perm -mode”之间的区别就好理解了。“-perm /mode”要求所匹配的权限之间是“或”的关系,“-perm -mode”则要求所匹配的权限之间是“与”的关系。也就是所,“-perm /220”表示所有者和所属组任何一个具有写权限就可以,而“-perm -220”则表示所有者和所属组必须同时具有写权限。

下面通过实例进行验证,首先我们准备一些测试文件。

[root@localhost ~]# mkdir /tmp/test
[root@localhost ~]# touch /tmp/test/test{1,2,3}
[root@localhost ~]# chmod 644 /tmp/test/test1
[root@localhost ~]# chmod 664 /tmp/test/test2
[root@localhost ~]# chmod 600 /tmp/test/test3

然后我们分别通过两种不同的方式进行模糊匹配。
以“-perm /220”作为条件,查找所有者和所属组具有写权限的文件,可以看到 3 个测试文件均符合查找条件。

[root@localhost ~]# find /tmp/test -perm /220 -type f
/tmp/test/test1
/tmp/test/test2
/tmp/test/test3

以“-perm -220”作为条件,查找所有者和所属组都具有写权限的文件,只有 /tmp/test2 符合查找条件。

[root@localhost ~]# find /tmp/test -perm -220 -type f
/tmp/test/test2

除了基本权限之外,find 命令也支持特殊权限。对于特殊权限,SUID对应的数字是 4,SGID 对应的数字是 2,粘滞位 sbit 对应的数字是 1。如果某个文件或目录被设置了特殊权限,那么它用数字形式表示的权限就成了 4 位数,特殊权限被放在左侧最高位。比如 /usr/bin/passwd 文件的权限为“rwsr-xr-x”,用数字形式表示就是 4755。再比如 /tmp 目录的权限为“rwxrwxrwt”,用数字形式表示就是 1777。
因而如果系统中查找所有设置了 SUID 的文件,那么应将查找条件设置为“4000”。由于所要查询的权限位只有 1 个,因而无论使用“-perm /4000”还是“-perm -4000”,都可以实现相同的效果。在 Centos 7 系统中,这类文件的数量是 27 个。

[root@localhost ~]# find / -perm -4000 2> /dev/null | wc -l
27
[root@localhost ~]# find / -perm /4000 2> /dev/null | wc -l
27

同理,如果要查找所有设置了 SGID 的目录,应指定条件“-perm /2000”或是“-perm -2000”。查找设置了 sbit 权限的目录,可以指定条件“-perm /1000”或是“-perm -1000”。
如果要查找所有设置了 SGID 或 Sbit 权限的目录,那么应该指定条件“-perm /3000”,如果将条件指定为“-perm -3000”,则表示查找既设置了 SGID 同时也设置了 Sbit 的目录。

#查找同时设置了SGID和Sbit的目录
[root@localhost ~]# find / -perm -3000 -type d -ls 2> /dev/null
#查找设置了SGID或是Sbit的目录
[root@localhost ~]# find / -perm /3000 -type d -ls 2> /dev/null
  8400    0 drwxrwxrwt   2 root     root           40 9月 11 11:17 /dev/mqueue
  8622    0 drwxrwxrwt   2 root     root           40 9月 11 11:17 /dev/shm
  69      4 drwxrwxrwt   7 root     root         4096 10月 19 11:16 /var/tmp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值