在使用linux时,经常需要进行文件查找。其中查找的命令主要有find和grep。两个命令是有区的。 (1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。 (2)grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找。(上一篇正则表达式就是在介绍grep命令)

文件属性查找工具有这两种 :1、locate :非实时查找(基于数据库查找)2、find: 实时查找。

1、locate :非实时查找(数据库查找)

工作特点: 
•查找速度快
•模糊查找 
•非实时查找 
•搜索的是文件的全路径,不仅仅是文件名
•可能只搜索用户具备读取和执行权限的目录
数据文件位置 :/var/lib/mlocate/mlocate.db
更新数据文件方法 :updatadb
索引构建过程需要遍历整个根文件系统,极消耗资源 ,生产中不建议全盘搜索,太消耗资源

locate KEYWORD
有用的选项
	-i 不区分大小写的搜索
	-n  N 只列举前N个匹配项目
	-r  使用正则表达式

示例: 搜索名称或路径中带有“conf”的文件 locate conf 使用Regex来搜索以“.conf”结尾的文件 locate -r ‘.conf$’

2、find: 实时查找

	工作特点: 
	• 查找速度略慢 
	• 精确查找 
	• 实时查找
	• 可能只搜索用户具备读取和执行权限的目
语法:
	find [OPTION]... [查找路径] [查找条件] [处理动作] 
	查找路径:指定具体目标路径;默认为当前目录 
	查找条件:指定的查找标准,可以文件名、大小、类型、 权限等标准进行;默认为找出指定路径下的所有文件
	处理动作:对符合条件的文件做操作,默认输出至屏幕

查找条件:

 指搜索层级
	-maxdepth  level 最大搜索目录深度,指定目录为第1级
	-mindepth  level 最小搜索目录深度
	如果指定搜索哪一级目录则,最大为此目录最小也为此目录
例如:指定搜索/etc目录下为5级目录的目录和文件
	Find /etc –maxdepth 5  –mindepth 5

根据文件名和inode查找:

-name "文件名称":支持使用glob(文件通配符)
	find /etc/ -name "*pas?wd*"
	*, ?, [], [^]
-iname "文件名称":不区分字母大小写
	find /etc/ -iname *pas?wd*   
-inum n  按inode号查找
	find -inum 69  //查看inode号为69的文件
-samefile name  相同inode号的文件
	find -samefile a123 	//查找硬链接
-links n   链接数为n的文件
	find -links 2  //查看链接数为2的文件
-regex "PATTERN":以PATTERN(正则表达式)匹配整个文件路径字符串,而不仅仅是文件名称
find /etc/ -regextype posix-egrep -regex  ".*/pa[sa]{2}wd"  //支持拓展表达式

根据属主、属组查找:

	-user  USERNAME: //查找属主为指定用户(UID)的文件
例:find –user lin  //查看用户名为lin的文件
	-group  GRPNAME: //查找属组为指定组(GID)的文件
	-uid  UserID: //查找属主为指定的UID号的文件
例:find –user 1003  //查看UID为1003的文件
	-gid  GroupID: //查找属组为指定的GID号的文件
	-nouser: //查找没有属主的文件
		例:find –nuuser //查找当前目录下没有属主的文件
	-nogroup: //查找没有属组的文件

根据文件类型查找:

	-type TYPE:      //TYPE选项
	find /dev/ -type  l  //查看dev下链接文件
	-type 	f: 普通文件
	-type 	d: 目录文件
	-type 	l: 符号链接文件
	-type 	s:套接字文件
	-type 	b: 块设备文件
	-type 	c: 字符设备文件
	-type 	p: 管道文件

组合条件查找

组合条件: 
 与:-a(and)  或:-o(or)  非:-not, !
德·摩根定律: 
	(非 A) 或 (非 B) = 非(A 且 B) 
	(非 A) 且 (非 B) = 非(A 或 B) 
示例: 、
	!A -a !B = !(A -o B) 
	!A -o !B = !(A -a B)

示例: find -name snow.png //• 搜索名为snow.png的文件 find -iname snow.png //• 不分大小写地搜索名为snow.png、Snow.png、 SNOW.PNG等等的文件 find / -name “.txt” //搜索根目录下以.txt结尾的文件 find /var –name “log” //搜索/var目录下文件名带log的文件 find -user joe -group joe //搜索被用户joe 以及组群joe所拥有的文件 find -user joe -not -group joe //搜索所属人是joe,但是所属组不是joe的文件 find -user joe -o -user jane //搜索所属人是joe,或者是jane的文件。 find -not ( -user joe -o -user jane ) //搜索不属于是joe且不属于jane的文件。 find / -user joe -o -uid 500 //搜索根目录所属人是joe或所属组为500的文件。 示例: 1、找出/tmp目录下,属主不是root,且文件名不以f开头的文件 find /tmp ( -not -user root -a -not -name 'f' ) –ls find /tmp -not ( -user root -o -name 'f*' ) –ls 查找并显示文件的方法   查找到某个文件是我们的目的,我们更想知道查找到的文件的详细信息和属性,如果我们采取现查找文件,在使用LS命令来查看文件信息是相当繁琐的,现在我们也可以把这两个命令结合起来使用 [root@centos6 bin]# find -user root -ls 137744 4 drwxr-xr-x 2 root root 4096 Jan 26 20:05 . 137793 4 -rwxrwxrwx 1 root root 135 Jan 26 10:40 ./per.sh

排除目录

示例:
1、查找/etc/下,除/etc/sane.d目录的其它所有.conf后 缀的文根据文件大小来查找:
find /etc -path ‘/etc/sane.d’ -a -prune -o -name “*.conf”
2、查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的其他所有.conf后缀的文件
find /etc \(–path ‘/etc/sane.d’ –o –path ’/etc/fonts’ \) -a prune –o name “*.conf”

根据文件大小查找

size [+|-] #UNIT
常用单位:k, M, G,c(byte)
UNIT: (#-1, #]
如:6k 表示(5k,6k]
UNIT:[0,#-1]
如:-6k 表示[0,5k]
+#UNIT:(#,∞)
如:+6k 表示(6k,∞)

根据时间戳查找:

	以“天”为单位;
		-atime [+|-]#,  
		#: [#,#+1)
		+#: [#+1,∞]
		-#: [0,#)
			-mtime
			-ctime
	以“分钟”为单位:
			-amin
			-mmin
			-cmin

示例: find /etc/ -mtime -1 //查看etc目录下一分钟以内的操作 find / -amin -10 # 查找在系统中最后10分钟访问的文件 find / -atime -2 # 查找在系统中最后48小时访问的文件 find / -empty # 查找在系统中为空的文件或者文件夹 find / -group cat # 查找在系统中属于 groupcat的文件 find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件 find / -mtime -1 #查找在系统中最后24小时里修改过的文件 find / -nouser #查找在系统中属于作废用户的文件 find / -user fred #查找在系统中属于FRED这个用户的文件

下面的列表就是对find命令所可以指定文件的特征进行查找的部分条件。在这里并没有列举所有的查找条件,参考有关Linux有关书籍可以知道所有find命令的查找函数。

-amin n 查找系统中最后N分钟访问的文件
-atime n 查找系统中最后n*24小时访问的文件
-mmin n 查找系统中最后N分修改过的文件
-mtime n 查找系统中最后n*24小时修改过的文件
-cmin n 查找系统中最后N分钟被改变状态的文件
-ctime n 查找系统中最后n*24小时被改变状态的文件
-empty 查找系统中空白的文件,或空白的文件目录,或目录中没有子目录的文件夹
-false 查找系统中总是错误的文件
-fstype type 查找系统中存在于指定文件系统的文件,例如:ext2 .
-gid n 查找系统中文件数字组 ID 为 n的文件
-group gname 查找系统中文件属于gnam文件组,并且指定组和ID的文件
			Find命令的控制选项说明:

  Find命令也提供给用户一些特有的选项来控制查找操作。下表就是我们总结出的最基本,最常用的find命令的控制选项及其用法。

选项 用途描述
-depth 使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容
-follow 遵循通配符链接方式查找; 另外,也可忽略通配符链接方式查询
-help 显示命令摘要
-maxdepth levels 在某个层次的目录中按照递减方法查找
-mount 不在文件系统目录中查找, 用法类似 -xdev.
-noleaf 禁止在非UNUX文件系统,MS-DOS系统,CD-ROM文件系统中进行最优化查找
-version 打印版本数字

下面的表格就是一些常用的查找文件并显示文件信息的参数和使用方法

    选项 用途描述
  -exec command; 查找并执行命令
  -fprint file 打印文件完整文件名
  -fprint0 file 打印文件完整文件名包括空的文件
  -fprintf file format 打印文件格式
  -ok command; 给用户命令执行操作,根据用户的Y 确认输入执行
  -printf format 打印文件格式
  -ls 打印同种文件格式的文件.

根据权限查找:

	 -perm [/|-]MODE
		 MODE: 精确权限匹配
		/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 从centos7开始淘汰,centos6及其之前的系统/ +均可用。
	-MODE:每一类对象都必须同时拥有指定权限,与关系
	0 表示不关注
	find?-perm?755 会匹配权限模式恰好是755的文件
	只要当任意人有写权限时,find?-perm?+222就会匹配   当权限描述为组合权限时,即5,6,7时,各权限间为或的关系
	只有当每个人都有写权限时,find?-perm?-222才会匹配  当权限描述为组合权限时, 即5,6,7时,各权限间为且的关系
	只有当其它人(other)有写权限时,find?-perm?-002才会匹配

 处理动作
	-print:默认的处理动作,显示至屏幕
	-ls:类似于对查找到的文件执行“ls -l”命令
	-delete:删除查找到的文件
	find -size +6k -delete
	-fls file:查找到的文所有件的长格式信息保存至指定文件中
	-ok -exec   ok交互式,exec直接运行
	find -name "*.tmp" -ok rm -f {} \;
	find -type f -name "*.sh" -exec chmod a+x {} \;
	find -name "*.conf" -exec cp -i {} {}.bak \;

-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个 文件执行命令之前,都会交互式要求 用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由 COMMAND指定的命令 
{}: 用于引用查找到的文件名称自身 
find传递查找到的文件至后面指定的命令时,查找到所有符合 条件的文件一次性传递给后面的命令

参数替换xargs

** 由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了xargs命令 **
xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为 arguments 
 注意:文件名或者是其他意义的名词内含有空格符的情况 
 有些命令不能接受过多参数,命令执行可能会失败,xargs可 以解决 
示例: ls f* |xargs rm 
find /sbin -perm +700 |ls -l       这个命令是错误的 
find /sbin -perm +7000 | xargs ls –l 
** find和xargs格式:find | xargs COMMAND **

find示例 find -name “.conf” -exec cp {} {}.orig ; • 备份配置文件,添加.orig这个扩展名 find /tmp -ctime +3 -user joe -ok rm {} ; • 提示删除存在时间超过3天以上的joe的临时文件 find ~ -perm -002 -exec chmod o-w {} ; • 在你的主目录中寻找可被其它用户写入的文件 find /data –type f -perm 644 -name “.sh” –exec chmod 755 {} ; find /home –type d -ls

实例:

1、查找/var目录下属主为root,且属组为mail的所有文件

[root@centos6 spool]# find /var -user root -and -group mail -ls 394408 4 drwxrwxr-x 2 root mail 4096 Jan 27 09:06 /var/spool/mail 396328 4 -rw------- 1 root mail 3263 Jan 26 09:29 /var/spool/mail/root

2、查找/var目录下不属于root、lp、gdm的所有文件

[root@centos6 /]# find /var -not -user root -not -user lp -not -user gdm -ls 394492 4 drwxr-xr-x 2 abrt abrt 4096 Mar 23 2017 /var/spool/abrt 396391 0 -rw-rw---- 1 linkang mail 0 Jan 26 09:43 /var/spool/mail/linkang 396380 0 -rw-rw---- 1 nologin mail 0 Jan 20 20:09 /var/spool/mail/nologin 396379 0 -rw-rw---- 1 sh mail 0 Jan 20 13:53 /var/spool/mail/sh 396355 0 -rw-rw---- 1 wei mail 0 Jan 17 08:28 /var/spool/mail/wei 396338 0 -rw-rw---- 1 500 mail 0 Jan 13 17:07 /var/spool/mail/liubei

3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件

[root@centos6 /]# find /var -mtime -7 -not ( -user root -o -user postfix ) /var/spool/mail/linkang /var/spool/mail/qwer /var/spool/mail/linakng /var/spool/mail/yio /var/spool/mail/werty /var/spool/mail/asdf

4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件

[root@centos6 ~]# find / -type f -nouser -nogroup -atime -7 /home/lin/.bash_history /home/lin/789 /home/lin/456

5、查找/etc目录下大于1M且类型为普通文件的所有文件

[root@centos6 ~]# find /etc -type f -size +1M /etc/gconf/gconf.xml.defaults/%gconf-tree.xml /etc/selinux/targeted/modules/active/policy.kern /etc/selinux/targeted/policy/policy.24

6、查找/etc目录下所有用户都没有写权限的文件 方法1: find /etc/ -not ( -perm -002 -o -perm -020 -o -perm -200 ) | xargs ls -l 方法2: [root@centos6 ~]# find /etc -not -perm +222 -ls -exec ls -l {} ; 1190012 4 -r--r--r-- 1 root root 80 Feb 22 2016 /etc/lvm/profile/thin-performance.profile 1190009 4 -r--r--r-- 1 root root 2391 Mar 23 2017 /etc/lvm/profile/command_profile_template.profile

7、查找/etc目录下至少有一类用户没有执行权限的文件 find /etc/ -not ( -perm -001 -a -perm -010 -a -perm -100 ) | xargs ls -l

8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件

find /etc/init.d/ -perm -113 |xargs ls -l find /etc/init.d/ -perm -113 -exec ls -l {} ; find /etc/init.d/ -perm -113 -ls