说find之前我们先说两个概念:文件查找;文本过滤。这是两个不同的概念,所使用的命令也是不一样的。
文件查找:查找目录中的文件
文本过滤:查找文本中的行
文本过滤的命令有:grep 、fgrep 、egrep 等
格式为:grep [选项] [查找模式] [文件名1,文件名2……]
文件查找的命令有:find 、locate等
格式为:find [查找目录] [查找条件] [动作]
现在大家对这两个命令有个大概的印象了吧,今天我们主要总结的是文件查找的命令,主要解析find。
文件查找:
locate :
特点 :模糊查找 非实时查找 速度快 功能有限
格式:#locate KEYWORD 直接跟文件名,也可以说是关键字。
过程:在整个系统查找,但速度很快,因为虽在整个系统查找,但事实上是在datebase 数据库( #updatedb 创建 查找的数据库)上查找,也就是非实时查找。
find:
特点:精确,实时查找,而且可指定查找路径,速度慢
格式为:find [查找目录] [查找条件] [动作]
[查找目录]:可以省略,省略表示当前目录及当前目录下的所有子目录。
[查找条件]:也可以省略,表示指定目录及子目录下的所有文件
[动作]:也可以省略,表示print,显示出来。
[查找目录]:
直接指定目录就可以,例如:/etc
[查找条件]:
- -name “FILENAME” 根据文件名查找 精确查找 区分大小写
- -iname "FILENAME" 不区分大小写
- -regex "PATTERN"正则表达式
- -iregex "PATTERN" 不区分大小写
- -user USERNAME 查找属于某个用户的
- -group GROUPNAME 根据属组 查找
- -uid UID
- -gid GID 把用户删除之后 用户原来创建的文件的属主 为原来用户的UID
- -nouser 没有属主的文件 应该经常查找这类文件 给他一个属主
- -nogroup 没有属组的文件
- -type (f,d,l,b,c,p,s)
- -size [+/-] # {k|M|G} 默认单位是字节 byte
- -size +2M 找大于2M的文件
- -size -2M 找小于2M的文件
- -size 2M (大于1k到两k的都显示 )
- ls -l ` find /etc -size 2k ` 命令引用 不可以通过管道
- 单位是day
- -atime [+/-]# 访问过的文件
- -mtime 修改的文件
- -ctime 改变
- -atime +3 三天前访问的
- -atime -3 最近三天访问的
- -atime 3 往前数第三天访问过的文件
- 单位是 minute
- -amin [+/-]#
- -mmin [+/-]#
- -cmin [+/-]#
- -perm 根据权限来查找
- mode 640 精确查找
- /mode /640 任何一位匹配都可以 /440 只要属主或属组有读权限的都可以满足。
- -mode -640 所有都带匹配 666也可以匹配 是包含的关系
- -440只要属主属组都有读权限 其他都不管
- -expty -expty 寻找文件大小为0 Byte的文件,或目录下没有任何子目 录或文件的空目录。
- -fls <列表文件> 此参数的效果和指定的“ls”参数类似,但会把结果保存为指定的列表文件
查找条件也支持多条件查找,条件间的逻辑关系 :
并: -a 默认没写 就是并关系。
或: -o
非:-not ,!
[动作]:
- -print 默认是显示
- -ls 显示详细信息
- -ok COMMAND {} \; 固定格式 提醒用户确认
- -exec COMMAND {} \; 同上 直接执行命令 {} 表示占位符
- xargs COMMAND 功能更强大 不需要占位符
- #find | xargs COMMAND find查找到的结果通过管道送过来
example:
下面通过一些例子,讲解每一个选项怎么用,可以达到什么效果。
查找/tmp目录下文件名为“passwd”或者属主是“root”的文件
#find /tmp -name "passwd" -o -user root 或关系
查找/tmp目录下文件名为“passwd”并且属主是“root”的文件
#find /tmp -name "passwd" -a -user root 并关系
查找/tmp目录下文件名不是“passwd”或者属主不是“root”的文件
#find /tmp -not -name "passwd" -o -not -user root
#find /tmp -not \(-name "passwd" -a -user root \)
两种写法都可以达到目的。
小插曲 :摩根定律,感兴趣的朋友可以自己查看。有助于我们理解
!a ∪ !b =! (a ∩ b)
!a ∩ !b = ! (a ∪ b)
查找当前目录下没有属主和属组的文件,并把属主属组改为root
#find ./ -nouser -a -nogroup -exec chown root:root {}\;
查找当前目录下其他用户有写权限的文件,把文件名后面加上.old
#find ./ -perm -002 -exec mv {} {}.old \; {}表示占位符 前面找到谁 就把{}替换成谁
查找/tmp目录下 属主是root,文件类型视普通文件的文件,先显示再删除
#find /tmp -user root -type f -print (显示) | xargs rm -f 删除
1、查找/var目录下属主为root并且属组为mail的所有文件;
2、查找/usr目录下不属于root,bin,或student的文件;
3、查找/etc目录下最近一周内内容修改过且不属于root及student用户的文件;
4、查找当前系统上没有属主或属组且最近1天内曾被访问过的文件,并将其属主属组均修改为root;
5、查找/etc目录下大于1M的文件,并将其文件名写入/tmp/etc.largefiles文件中;
6、查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;
转载于:https://blog.51cto.com/5122542/905990