语法:
find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:默认为当前路径;
查找条件:指定的查找标准,可以根据文件名、大小、属主属组、类型等进行;默认为找出指定路径下的所有文件;
根据文件名进行查找:
-name "文件名称": 支持使用glob;即通配符 *, ?, []
-iname "文件名称":不区分字符大小写,支持使用glob;
-regex"PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称;
例:find /root -regex "/root/x.*" 一定要写上查找路径,默认当前路径也不能省略
根据属主、属组查找:
-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 / -user dx -type f 查找用户名为dx文件类型为普通的文件
组合查找条件:
与条件:-a
或条件:-o
非条件:-not, !
!A -o !B = !(A -a B)
!A -a !B = !(A -o B)
例:
find / -user dx -type f 默认为与条件
find / -user dx -o -type l查找用户名为dx或文件类型为符号链接的文件
find / ! -user dx 查找用户名不是dx的文件
根据文件大小进行查找:
-size [+|-]#unit #为一个整数
1. #unit 例如-size 3k 要注意!这里含义是一个范围{3-1,3} 即2K至3K
2. +#unit 例如-size +3k 这个好理解,意思是3K以上
3. -#unit 等于{0,#-1} 例如-size -3k 这里又要注意了!又是一个范围了,小于{3-1}K,即小于2K
根据时间进行查找:
这里又分以天(24小时)为单位:
-atime 访问时间。如 ls, more 等, 但 chmod, chown, ls, stat 等不会修改些时间, 使用 ls -utl 可以按此时间顺序查看;
-mtime 修改时间。如 chmod, chown 等状态时间改变但修改时间不会改变, 使用 stat file 可以查看;
-ctime 改变时间。如 vi 保存后等, 修改时间发生改变的话, atime 和 ctime 也相应跟着发生改变。
这里时间的条件使用也很特别!例如:
-mtime 4 表示查找5天前4天后被修改的,大于等于4小于5
-mtime +4 表示5天后被修改的,大于等于5
-mtime -4 表示4天以内被修改的,小于4
按文件修改时间查找文件
---(+n)----------|----------(n)--------- -|----------(-n)---
(n+1)*24H前| (n+1)*24H~n*24H间 |n*24H内
-ctime -n 查找距现在 n*24H 内修改过的文件
-ctime n 查找距现在 n*24H 前, (n+1)*24H 内修改过的文件
-ctime +n 查找距现在 (n+1)*24H 前修改过的文件
以分钟为单位:
-amin 访问
-mmin 修改
-cmin 改变
注意: linux 里是不会记录文件的创建时间的, 除非这个文件自创建以来没有发生改变, 那么它的创建时间就是它的最后一次修改时间。
#ls -lt /home/admin # 按修改时间顺序查看
#ls -lut /home/admin # 按访问时间顺序查看
(如果想反序查看的话需要加一个选项 -r)
ls –tl file 按时间顺序显示
根据权限:
-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 技巧:
时间查找技巧
语法:-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 –ok 用法,留意这里没有-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分钟之前
find、xargs、cp结合使用
find . -name "*" |xargs cp ????
这里 xargs cp 怎么区分cp源 和 cp目的
例:想把 查询到的文件 都copy到/home/users/中去
find . -name "*" | xargs cp /home/users/
find . -name "*" | xargs -i cp {} /home/users/
-I 必须指定替换字符 -i 是否指定替换字符-可选
例:
find . | xargs -I {} cp {} $D_PATH
与
find . | xargs -i cp {} $D_PATH
find 和 cp 命令组合
例:find / -name '*.so*' -exec cp {} /home/ \;