强大的find命令
语法:
find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:默认为当前路径;
查找条件:指定的查找标准,可以根据文件名、大小、属主属组、类型等进行;默认为找出指定路径下的所有文件;
根据文件名进行查找:
-name "文件名称": 支持使用glob;
*, ?, []
-iname "文件名称":不区分字符大小写,支持使用glob;
-regex"PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称;
根据属主、属组查找:
-user USERNAME: 查找属主为指定用户的文件;
-group GROUPNAME:
-uid UserID: 查找文件的属主指定uid的文件;
-gid GroupID:
-nouser: 查找没有属主的文件;
-nogroup:查找没有属组的文件;
例:
find /-nouser -a -nogroup 查找没有属主、属组的文件
根据文件类型进行查找:
-type TYPE
f: 普通文件
d: 目录
l: 符号链接
b: 块设备
c: 字符设备
p: 命名管道
s: 套接字
例:
find / -userdx -type f 查找用户名为dx文件类型为普通的文件
组合查找条件:
与条件:-a
或条件:-o
非条件:-not, !
!A -o !B = !(A -a B)
!A -a !B = !(A -o B)
例:
find / -userdx -type f 默认为与条件
find / -user dx -o -type l查找用户名为dx或文件类型为符号链接的文件
find / ! -user dx 查找用户名不是dx的文件
根据文件大小进行查找:
-size [+|-]#unit #为一个整数
1. #unit 例如-size3k 要注意!这里含义是一个范围{3-1,3}
2K至3K
2. +#unit 例如-size +3k 这个好理解,意思是3K以上
3. -#unit 等于{0,#-1} 例如-size -3k 这里又要注意了!又是一个范围了,小于{3-1}K,即小于2K
根据时间进行查找:
这里又分以天(24小时)为单位:
-atime 访问时间
-mtime 修改时间
-ctime 改变时间
这里时间的条件使用也很特别!例如:
-mtime 4 表示查找5天前4天后被修改的,大于等于4小于5
-mtime +4 表示5天后被修改的,大于等于5
-mtime -4 表示4天以内被修改的,小于4
以分钟为单位:
-amin 访问
-mmin 修改
-cmin 改变
根据权限:
-perm [/|-]MODE
MODE: 精确权限匹配
/MODE:任何一类对象(u,g,o)的任何一位权限符合条件即可;隐含或条件;
-MODE:为每一类对象指定的每一位权限都必须同时存在方为符合条件;隐含与条件;每一类用户的权限都包含对其指定的所有权限。即至少有指定的权限!
例:
#find /tmp -perm 755 //查找在/tmp目录下权限是755的文件
#find /tmp -perm +222 //表示只要有一类用户(属主,属组,其他)的匹配写权限就行
#find /tmp -perm -222 //表示必须所有类别用户都满足有写权限
处理动作:
-print: 默认处理动作,默认为输出至屏幕
-ls:类似于对查找到的每个文件做"ls -l"的操作;
-delete: 删除查找到的文件;
-fls /path/to/somefile:查找到的文件的详细路径信息保存至指定文件中;
-ok COMMAND {} \;对每个文件执行指定的命令之前需要用户事先确认;
-exec COMMAND {} \;无需用户确认;
find 技巧:
时间查找技巧
用man说明:-mtime n Files data was last modified n*24 hours ago.
所以find -mtime 4 是找到所有在距现在96小时之内被修改过的文件或目录。
find -mtime 4 是找到所有5天前4天后被更改的档案文件,
find -mtime -4 是4天内被改的档案,
find -mtime +4 是4+1天,5天后被改的档案。
其他技巧:至少一类用户没有的反义是所有用户都有,再取反就ok了,正面难写时就取反,再在个反就得到了
例如:练习题16(至少有一类用户,所以用-,没有执行权限,反过来理解就是有执行权限111,然后用!取反就得到结果了)
查找/etc目录下至少有一类用户没有执行权限的文件;
方法一:find /etc \( ! -perm /001 -o ! -perm /010 -o ! -perm/100 \)
方法二:find /etc ! -perm -111
find �Cok 用法,留意这里没有-exec
find /root/ -name "del.txt" -ok -rm {} \;
文件大小查找技巧:
例如:一个文件5556字节,可以这样写
find /root -size -5557c -size+5555c -exec ls -ld {} \;
(即查找大于5555字节小于5557字节的文件,以上查找的是/root 目录)
查找 小于500K,大于50K的文件
find /root -size -500K -size+50K -exec ls -ld {} \;
size默认单位是b,而它代表的是512字节,所以2表示1K,1M则是2048,如果不想自己转换,可以使用其他单位,如c、K、M等
find . -empty 查找当前目录大小为0的文件或空目录
正则匹配实例与技巧:
find path -regex"xxx"
find path -iregex"xxx"
这两条命令都是运用base-regexp对文件路径进行匹配,iregex忽略大小写。
但是给出的正则表达式必须要匹配完整的文件路径
比如:find /-regex "find" 这样子是找不到/usr/bin/find的,要像这样find / -regex ".*find"或者更精确一点find/ -regex ".*/find"
如果要使用扩展的正则表达式,对于BSD系的find可以在路径名前加一个"-E"选项
GNU的find支持多种风格的正则表达式,用-regextype 指定所使用的正则表达式类型,可选的有emacs(默认),posix-awk,posix-basic,posix-egrep,posix-extended,喜欢了grep -E,所以我就用posix-egrep了
find / -regextype "posix-egrep" -regex ".*/find"
find . -exec chown dx:root {}\;改变当前目录下所有文件的权限
find . -cmin -10 查找当前目录下10分钟内被修改过的文件,+10即是10分钟之前