前言:
文件查找:
在文件系统上查找符合条件的文件;
这与grep是完全不同的,grep是文本处理工具。find与locate是针对于文件的而不是文件中的文本内容。
文件查找常用工具:locate, find
区别: 非实时查找(数据库查找):locate
实时查找:find
locate:
locate的工作机制:
依赖于事先构建的索引库;索引的构建是在系统较为空闲时自动进行(周期性任务);手动更新数据库(updatedb);
索引库的构建方式一般有两种:
- 系统自动实现;(系统在较为空闲的时候自动进行(周期性的任务)),在操作系统刚装完是没有的。但是操作系统可能定义了一些任务在一段时间后会由某个程序实现自动构建。
- 手动更新数据库使用updatedb这个命令。
索引构建过程需要遍历整个根文件系统,极消耗资源;
locate索引库的构建具体过程:
系统的周期性的任务程序会遍历整个文件系统。生成一个由keyword和keword的文件路径组成的 K-V数据库,也就是索引库。
但locate查找某个文件时。locate会去查找索引库,并对keword进行模糊匹配。但是索引库不是实时更新的。也就是说,如果A文件在索引库这次更新和下次更新之间被删除了。那么locate可以查到A文件,但是实际上A文件已经不存在了。你只能在下次索引库更新后才能使用locate发现A文件不见了。强调一下,索引库里记录的是文件路径。也就是说locate查找得到的结果是文件存在的路径。
工作特点:
- 查找速度快;
- 模糊查找;
- 非实时查找;可能有部分结果不准确。
locate用法:
locate [OPTION]... PATTERN...
-A ,--all 同时满足所有的 PATTERN才可以。
-b ,--basename只匹配路径当中的基名。
-c,--count。不把查找结果显示出来而是把复合条件数目的统计出来。
-r, 支持基本的正则表达。若不加则不支持。
find:
find工作机制:
实时查找工具,通过遍历指定路径下的文件系统完成文件查找;
工作特点:
- 查找速度略慢;
- 精确查找;
- 实时查找;
find语法:
find [OPTION]... [查找路径] [查找条件] [处理动作]
- 查找路径:指定具体目标路径;默认为当前目录;
- 查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件;
- 处理动作:对符合条件的文件做什么操作;默认输出至屏幕;
- 查找条件:
- 根据文件名查找:
-name "文件名称":支持使用glob风格。
*, ?, [], [^]
例子 find /etc/ -name
-iname "文件名称":不区分字母大小写
-regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称;
2.根据属主、属组查找:
-user USERNAME:查找属主为指定用户的文件;
-group GRPNAME: 查找属组为指定组的文件;
-uid UserID:查找属主为指定的UID号的文件;
-gid GroupID:查找属组为指定的GID号的文件;
-nouser:查找没有属主的文件;
-nogroup:查找没有属组的文件;
3.根据文件类型查找:
-type TYPE:
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
4.组合条件:
与:-a
或:-o
非:-not, !
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
找出/tmp目录下,属主不是root,且文件名不是fstab的文件; find /tmp -not -user root -a -not -name ‘fstab‘ -ls find /tmp -not \( -user root -o -name ‘fstab‘ \) -ls
5.根据文件大小来查找:
-size [+|-]#UNIT
常用单位:k, M, G #UNIT: (#-1, #] 精确查找,例如:find /etc -size 5k 表示 查找文件大小为大于4k小于等于5k的文件。(4,5]k -#UNIT:[0,#-1] 例如:find /etc -size -5k 表示查找文件大小大于等于0k且小于等于4k的文件[0,5-1]k +#UNIT:(#,oo)例如:find /etc -size +5k 表示查找文件大小大于5k的文件。(5k,+∞)
6.根据时间戳:
以“天”为单位;
-atime 表示访问时间 。[+|-]#。 a. #: [#,#+1) 例如:find /etc -atime 3 表示以现在查找的时间为基准,过去[3×24小时,4×24)之间被访问过的文件
如图:
b. +#: [#+1,oo] 例如 :find /etc -atime +3 表示以现在查找的时间为基准,过去4×24小时之前被访问过的文件。包括从现在时刻之前的4×24小时这个时刻。
如图:
·
c. -#: [0,#) 例如:find /etc -atime -3 表示以现在查找的时间为基准,过去(3×24小时,0×24小时]包含现在时刻被访问过的文件。就是3天内。
-mtime 表示修改时间
-ctime 表示改变时间
以“分钟”为单位:
-amin
-mmin
-cmin
用法同上。
总结几个特殊的:
一天内 find /etc -atime 0 或者 find /etc -atime -1
一天前 find /etc -atime +0
两天前 find /etc -atime +1
两天内 find /etc -atime -2
6.根据权限查找:
-perm [/|-]MODE a. MODE: 精确权限匹配 表示完全精确匹配。
示例:查找/etc 下权限为644的文件
find /etc -perm 644
b. /MODE:任何一类(u,g,o)用户的任何一位(r,w,x)符合条件即满足;9个权限位只要有一个满足就满足。
示例:
查找/etc下至少一类用户有写权限。
find /etc -perm /222
查找/etc下所有用户都没有写权限
find /etc -not -perm /222
查找/etc下至少一类用户有执行权限。
find /etc -perm /111
查找/etc下其他用户有执行权限。
find /etc -perm /001
注意:这里的0并不是没有任何权限的意思。而是指任意权限,不关心属主和属组的权限是什么。只关心其他用户有x权限。
补充:在操作系统上其他用户有写权限的文件是很危险的。不建议这么设定。所以可以 find /PATH/SONMEFILE -perm /002 找出来。
c. -MODE:每一类用户(u,g,o)的权限中的每一位(r,wx)同时符合条件即满足;
示例:
查找/etc下每一类用户都有写权限的文件
find /etc -perm -222。
查找/etc下至少有一类用户没有写权限的文件。
find /etc -not -perm -222。
特殊的:
查找/etc 下其他用户有写权限的文件。
find /etc -perm /002 或者 find /etc -perm -002 二者效果一样的因为我们不关心属主和属组的权限是什么。
但是find /etc -perm /022 与 find /etc -perm -022 就不同了。前者表示属组或者其他用户有写权限。后者表示属组与其他用户都有写权限。
B. 处理动作:
-print:默认的处理动作,显示至屏幕;
-ls:类似于对查找到的文件执行“ls -l”命令;
-delete:删除查找到的文件;
-fls /path/to/somefile:查找到的所有文件的长格式信息保存至指定文件中;
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;
对于每个文件执行命令之前,都会交互式要求用户确认;注意结尾的分号
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;
{}: 用于引用查找到的文件名称自身;注意结尾的分号
示例:
查找 /tmp 下其他用户有写权限的文件并修改该文件文some.danger的格式
find /tmp -perm /002 -exec mv {} {}.danger \;
注意:find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令;有些命令不能接受过多参数,此时命令执行可能会失败;另一种方式可规避此问题:
find | xargs COMMAND