前言:数据库
文件查找:ide
在文件系统上查找符合条件的文件;工具
这与grep是彻底不一样的,grep是文本处理工具。find与locate是针对于文件的而不是文件中的文本内容。
ui
文件查找经常使用工具:locate, findspa
区别: 非实时查找(数据库查找):locate操作系统
实时查找:findblog
locate:索引
locate的工做机制:ci
依赖于事先构建的索引库;索引的构建是在系统较为空闲时自动进行(周期性任务);手动更新数据库(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