find使用说明
一、定义
在文件系统上查找符合条件的文件的过程
二、命令工具
locate:非实时查找工具,依赖于系统在较空闲时自动构建的索引数据库查找。
优点:按索引查找,速度更快;
缺点:索引数据库的构建并非是根据文件的修改实时更新。所以,查找的信息是过期的,只能够模糊查询;
find:实时查找;find查找需要遍历整个默认或指定的目录,能够做到精确查找,查找速度却很慢。
三、find使用说明
find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:默认为当前路径
查找条件:根据OPTION指定查找标准,具体条件可以使用正则表达式匹配
处理动作:对符合条件的文件作出的动作;默认为输出到屏幕
OPTION和查找条件:
1、根据文件名查找:
-name FILENAME 可使用正则匹配
-inameFILENAME 不区分字符大小写
-regex "PATTERN" 匹配整个文件路径字符串,而不仅仅是文件名
2、根据文件类型查找:
-type f|b|d|l|c|s
f:普通文件
b:块文件
c:字符文件
d:目录
l:链接文件
s:socket 套接字文件
3、根据属主,属组查找
-nouser 查找没有属主的文件
-nogroup 查找没有属组的文件
-user USERNAME 查找属主为USERNAME的文件
-group GROUPNAME 查找属组为GROUPNAME的文件
-uid UID
-gid GID
4、根据文件大小查找
-size [+|-] #
单位:K,M,G
# (#-1,#] #-1 < filesize <= #
+# (#,+oo) # < filesize
-# [0,#-1) 0 <= filesize < #-1
5、根据时间戳
单位为”天“
-atime accessed时间戳
-mtime modified时间戳 修改内容
-ctime changed时间戳 修改内容,属性
单位为”分“
-amin
-mmin
-cmin
# [#,#+1) 第 #天 # <= file[a|m|c]time < #+1
+# [#+1,+oo] #天前 #+1 <= file[a|m|c]time
-# [0,#) #天内 0 <= file[a|m|c]time < #
注解:#为当前时间减去文件时间戳的时间
6、根据权限
-perm [+|-]MODE
MODE:与MODE精确匹配
/MODE或+MODE:任何一类用户只要能包含对其指定的任何一位权限即可
例:+555 表示只要目录文件只要属主或数组或任何人中只要有W或X就匹配
-MODE:每一类用户的权限都包含对其指定的所以权限
-222: 666权限的文件符合 664不符合
7、组合查找
与:-a and
或:-o or
非:-not !
公式:
!A -o !B = !(A -a B)
!A -a !B = !(A -o B)
处理动作
-print: 默认处理动作
-ls:类似于对查找到的每个文件做"ls -l"的操作;
-delete: 删除查找到的文件;
-fls /path/to/somefile:查找到的文件的详细路径信息保存至指定文件中;
-ok COMMAND {} \;
对每个文件执行指定的命令之前需要用户事先确认;
-exec COMMAND {} \;
无需用户确认;
四、练习
1、查找/var目录属主为root,且属组为mail的所有文件;
# find /var -user root -group mail -ls
2、查找/usr目录下不属于root、bin或hadoop的所有文件;
# find /usr ! \( -user root -o bin -o hadoop \) -ls
3、查找/etc目录下最近一周内其内容修改过,且属主不为root或hadoop的所有文件;
# find /etc ! \( -user root -o hadoop \) -mtime -7 -ls
4、查找当前系统上没有属主或属组,且最近一周内曾被访问过的所有文件;
# find / \( -nouser -a -nogroup \) -a -atime -7 -ls
5、查找/etc目录下大于20k且类型为普通的所有文件;
# find /etc -type f -size +20k -ls
6、查找/etc目录下所有用户都没有写权限的文件;
# find /etc ! -perm +222 -ls
7、查找/etc目录下至少有一类用户没有执行权限的文件;
# find /etc ! -perm -111 -ls
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户拥有写权限的文件;
# find /etc/init.d -perm -113 -ls