一、简介
文件查找:在文件系统上查找符合条件的文件。
实现工具:find,locate,which,whereis
实现方式:whereis和locate是通过数据库查找文件,which是通过”PATH”环境变量规定的路径查找文件,find则是通过指定路径下遍历文件系统。
find的工作特性
实时查找工具,遍历指定起始路径下文件系统层级结构完成文件查找。
工作特性:精确查找,速度略慢,实时查找
二、find命令具体用法
1、find命令
# NAME find - search for files in a directory hierarchy
SYNOPSIS find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
用法:find 选项 [查找起始路径][查找条件][处理动作]
查找起始路径:指定具体搜索目标起始路径;默认为当前目录;
查找条件:根据文件名、大小、类型、从属关系、权限等查找标准进行;默认找出指定路径下的所有文件;
处理动作:对符合查找条件的文件做出的操作;默认为输出至标准输出;
查找条件:
表达式:选项和测试
测试:
根据文件名查找:
name “pattern” :支持glob风格的通配符;
-iname “pattern”:不区分大小写;
-regex pattern:基于正则表达式模式查找文件,匹配是整个路径,而非其名;不常用。
根据文件从属关系查找:
-user username:根据用户属性指定用户的文件;
-group GRPNAME:指定所有用户组的文件;
-uid UID:用户指定的UID的所有文件;
-gid GID :用户组指定的GID的所有文件;
-nouser:查找没有属主的文件;
-nogroup:查找没有属组的文件;
根据文件的类型查找:
-type TYPE:
f: 普通文件
d: 目录文件
l:符号链接文件
b:块设备 文件
c:字符设备文件
p:管道文件
s:套接字文件
根据文件的大小查找:
-size[+][-]#unit
常用单位:k,M,G
#UNIT:(#-1,#] -#UNIT:[0,#-1] +#UNIT:(#,oo)
根据时间戳查找:
以“天”为单位:
-atime #:(#-1,#] 某天访问 表示为#天之前的“一天之内”访问过的文件
-atime -#:(#,0] 某天内
-atime + #:(oo,#-1] 多于某天
-ctime change 修改:文件内容;用法与 -atime 类似;
-mtime modification 修改:用户属性、用户组属性、文件名、;
用法与 -atime 类似;
以“分钟”为单位 :
-amin -cmin -mmin 用法与上面类似;
根据权限来查找:
-perm[/][-]mode
mode:精确权限匹配
/mode:任何一类用户的权限的任何一位符合条件即满足9位权限的或关系
-mode:任何一类用户的权限的任何一位同时都要符合条件即满足9位权限的与关系
组合测试:与:-a , 不加连接符默认组合逻辑与 或:-o 非:-not,!
处理动作:
-print :输出至标准输出
-ls :类似 “ls-l”
-delete :删除查找到的文件
-fls /path/to/somefile
-ok COMMAND {}\; :对查找到文件,等用户确认
-exec COMMAND {}\; :由命令执行更改。
三、练习
1、查找/var目录下属主为root,且属组为mail的所有文件或目录;
2、查找/usr目录下不属于root, bin或hadoop的所有文件或目录;用两种方法;
3、查找/etc目录下最近一周内其内容修改过,且属主不是root用户也不是hadoop用户的文件或目录;
4、查找当前系统上没有属或属组,且最近一周内曾被访问过的文件或目录;
5、查找/etc目录下大于1M且类型为普通文件的所有文件;
6、查找/etc目录下所有用户都没有写权限的文件;
7、查找/etc目录至少有一类用户没有执行权限的文件;
8、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的所有文件;
四、总结
1、组合测试需注意:-a:组合逻辑与(默认);-o:组合逻辑或;-not、!:组合逻辑非。
2、文件大小、时间戳用法比较特别
3、权限查找易混淆:/mode:相当于9位权限的逻辑或关系;-mode:9位权限的逻辑与的关系。