Linux文件查找利器 locate & find

前言

Linux的哲学思想就是一切皆文件,整个Linux系统就是由一个个的文件组成。所以对于Linux用户来说,与文件打交道是必不可少的工作。小到普通文件,大到配置文件、设备文件,可谓是一切皆文件。面对这些不计其数的文件,如何高效的查找文件,也是熟练使用Linux必不可少的技能了。 面对Linux里面这些海量的文件,怎样才能进行有效的快速的查找呢?这就要用到接下来要讲的locate和find命令了。locate和find是两个功能非常强大的查找命令,特别是find命令选项众多,使用选项时的灵活配合,可以帮助你快速找到想要的文件。


locate和find命令简介

locate命令是一个基于数据库的快速文件搜索工具,其工作原理是在系统里创建一个包含了系统内所有文件名以及路径的文件索引数据库,搜索依赖于事先构建的索引数据库进行。由于是基于数据库(/var/lib/mlocate/mlocate.db)的搜索,所以locate命令的查找不具有实时性。locate所找的文件若是最近才创建或刚更名的,可能会找不到。 系统内的文件是时常改变的,数据库也不能一成不变,否则就很难达到文件查找的作用,所以索引数据库在创建好之后一般都会被放入到自动计划里,定时自动更新。此外,管理员也可以通过updatedb命令进行实时的更新,但会相当耗费系统资源,所以不要在访问高峰时段更新数据库。 由于locate命令进行文件的查找时,是去文件索引数据库里查找,而非深入系统中的去查找,所以比find命令整个硬盘搜寻文件速度要快。locate命令具有以下工作特性。 locate命令工作特性:

  • 查找速度快
  • 模糊查找
  • 非实时查找
  • 搜索的是文件的全路径,不仅仅是文件名
  • 可能只搜索用户具备读取和执行权限的目录

find命令是一个实时查找工具,通过不同查找路径、查找条件、处理动作的组合,可以完成非常复杂的查找任务,功能非常多样且实用。而且,find命令还支持通配符和正则表达式的使用,使搜索变的更加灵活。由于是实时遍历查找,find有如下特性。 find命令工作特点:

  • 列表内容
  • 查找速度略慢
  • 精确查找
  • 实时查找
  • 可能只搜索用户具备读取和执行权限的目录

locate命令用法

locate [OPTION]... PATTERN...
常用选项:
	-i	   不区分大小写 
	-n N   只列举前N个匹配项目
	-r	   使用扩展的正则表达式来匹配搜索
示例:
locate passwd
	查找文件名包含passwd的文件
locate conf
	搜索名称或路径中带有“conf”的文件
locate -r '\.conf$'
	使用Regex来搜索以“.conf”结尾的文件

find命令用法

find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录。
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认找出指定路径下的所有文件。
处理动作:对符合条件的文件做操作,默认输出至屏幕。

使用时如果不选定参数,则在当前目录下查找子目录与文件并显示;且任何位于参数之前的字符串,都将视为欲查找的目录名。

查找条件:

搜索层级
	-maxdepth  level		最大搜索目录深度,指定目录为第一等级
	-mindepth  level		最小搜索目录深度
文件名和iNode
	-name  "文件名称"      搜索指定名称的文件,支持使用glob
	-iname  "文件名称"     搜索时不区分字母大小写
	-inum  n              按iNode号查找
	-samefile  name       查找相同iNode号的文件
	-links  n             查找链接数为n的文件
	-regex  "PATTERN"     以正则表达式匹配整个文件路径字符串,而不仅仅是文件名称
属组和属主
	-user username		查找属主为指定用户的文件
	-group groupname	查找属组为指定组的文件
	-uid userid		查找属主为指定UID的文件
	-gid gourpid	查找属组为指定GID的文件
	-nouser		查找没有属主的文件
	-nogroup	查找没有属组的文件
	示例:
		find / -nouser
			搜寻系统中不属于任何人的档案,透过这个指令,可以轻易的就找出那些不太正常的档案。
文件类型
	-type f		普通文件 
	-type d 	目录文件
	-type l 	符号链接文件
	-type s 	套接字文件
	-type b		块设备文件
	-type c		字符设备文件
	-type p		管道文件
	示例:
		find /dev -type b
			查找/dev目录下的块设备
文件大小
	-size [+|-] #unit	
		常用单位:k 、M 、G 、c (byte)
	#UNIT: (#-1, #]
		如:6k 表示(5k,6k]
	-#UNIT:[0,#-1]
		如:-6k 表示[0,5k]
	+#UNIT:(#,∞)
		如:+6k 表示(6k,∞)
	示例: 
		find / -size +1000k
			找出系统中,大于 1MB 的档案
时间戳
	以“天”为单位;
		-atime[+|-]#   
			#: [#,#+1)
				#为数字,意义为在#天之前的一天之内被access过的文件
			+#: [#+1,∞]
				在#加一天后被access过的文件
			-#: [0,#)
				在#天之前被access过的文件
		-mtime       被 modification 过的档案
		-ctime       被 change 过状态的档案
	以“分钟”为单位:
		-amin
		-mmin
		-cmin
	-newer file :
		file为一个存在的文件,只要文件比file还要新,就会被列出来。 用在分辨两个档案之间的新旧关系是很有用的!
	示例:
		find / -atime 0
			0 代表当前的时间,从现在开始到24小时前被访问过的文件
		find / -mtime 3 ,
			列出今天之前的 3*24 ~ 4*24 小时之间有变动过的文件
		find /etc -newer /etc/passwd
			查找 /etc 底下的档案,如果档案日期比 /etc/passwd 新就列出	

time

权限
	-perm [/|-]MODE
		MODE: 精确权限匹配
		/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,
		-MODE:每一类对象都必须同时拥有指定权限,与关系
	对于/MODE和-MODE,0权限表示不关注
	示例:
		find -perm 755    
			只会匹配权限模式恰好是755的文件
		find -perm /222   
			只要任何人有写权限,就会匹配
		find -perm -222	 
			 只有当每个人都有写权限时,才会匹配
		find -perm -002	  
			只有当其它人(other)有写权限时,才会匹配	
组合条件
	与:-a
	或:-o
	非: -not ,!
	德·摩根定律:
		(非A) 或(非B) = 非(A 且B)
		(非A) 且(非B) = 非(A 或B)
	示例:
		!A -a !B = !(A -o B)
		!A -o !B = !(A -a B)
	排除:-prune
	路径:-path 
	示例1:
		find /etc -path ‘/etc/sane.d’ -a -prune -o -name “*.conf”
		在/etc目录下查找除/etc/sane.d 目录之外的以.conf结尾的文件
	示例2:
		find /etc \( -path '/etc/sane.d' -o -path '/etc/fonts' \) -a prune -o -name "*.conf"
		查找/etc目录下除/etc/sane.d和/etc/fonts目录外的以.conf结尾的文件	

45 非

处理动作:

-print
	 显示至屏幕,默认的处理动作
-ls
	类似于对查找到的文件执行“ls -l”命令  默认只显示最后一项查找的长格式,如果要都显示需要加\(  \),括号内条件要和括号间有空格。
-delete
	删除查找到的文件
-fls file
	把查找到的所有文件以长格式信息保存至指定文件中
-ok COMMAND {} \; 
	对查找到的每个文件执行指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \;
	 对查找到的每个文件执行由COMMAND指定的命令,没有交互式确认,慎重使用。
	{}
		 用于引用查找到的文件名称自身,相当于一个变量。
	\;	
		表示结束,前面要有空格,否则会有语法错误
示例:
	find -name “*.conf” -exec cp {} {}.orig \;
		备份配置文件,添加.orig这个扩展名
	find /tmp -ctime +3 -user joe -ok rm {} \;
		查找删除存在时间超过3天以上的joe的临时文件
	find ~ -perm -002 -exec chmodo -w {} \;
		在你的主目录中寻找可被其它用户写入的文件,找到后取消写权限
	find / -perm +7000 -exec ls -l {} \;
		将找到的文件使用 ls -l 列出来

补充:参数替换命令xargs

由于很多命令不支持管道 "|"来传递参数,而日常工作中有这个必要,所以就有了xargs命令。xargs用于产生某个命令的参数,xargs可以读入标准输入的数据,并且以空格符或回车符将标准输入的数据分隔成为参数。 find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令,有些命令不能接受过多参数,命令执行可能会失败,这个问题xargs可以解决。 注意:文件名或者是其他意义的名词内含有空格符的情况 find和xargs格式:find | xargs COMMAND

示例:
	ls  f*  | xargs  rm
			列出以f开头的文件传递给rm删除
	查找/sbin下属主拥有读写执行任何一项权限的文件以长格式列出
		find  /sbin  -perm +700  | ls -l 
			这个命令是错误的,不会成功执行。
		find  /sbin  -perm +700  | xargsls  –l  
		    正确写法 

总结

如果你要查找一个文件的话,使用 find 会是一个不错的主意! find具有众多的参数指令,而且还支持正则表达式和通配符,使用灵活。根据文件的属性使用find命令进行查找也非常实用,配合处理命令可以完成许多复杂的工作,尤其是在查找特殊的文件,以及特殊的文件权限 (SUID/SGID等等) 时, 是相当有用的工具之一!不过缺点也是很明显的,速度上和locate就没法比了。locate是一个快速搜索工具,缺点是在功能上比find逊色一些,但在进行一些不算复杂的搜索时,还是locate快速有效。 希望看过之后对你有所帮助,祝你用好locate & find,提高工作效率。