在文件系统上查找符合条件的文件(不是文本文件的内容):
实现工具:locate,find。
locate:
查询速度快, 模糊查找,非实时的查找(不能反映出当前系统是否有此文件,因为从数据库里查找)。
locate:根据事先构建的索引库(数据库)来进行文件查找。
系统自动更新系统库(周期性更新),数据库不能精确反应当前存在的系统文件,比如刚新建一个文件,系统还没有 进 行更新,则可能查找的时候,就查找不到此文件。
updatedb 手动更新数据库,但是手动更新数据库特别消耗资源。
locate -b 只匹配路径中的基名。
locate -c 统计出有多少个符合条件的文件。
locate -r 可以使用基本正则表达式进行查找。
find:
不依赖于任何数据库文件,通过遍历指定起始路径下文件系统层级结构完成文件查找,实时查询 。
查找速度慢,精确查找,实时查询。
用法:
find [查找起始路径] [查找条件][处理动作]
查找起始路径:指定搜索目标起始路径;默认为当前目录。
查找条件:指定的查找标准,可以根据文件名,大小,类型,从属关系,权限等标准进行。默认找出指定路径下的所有 文件。
处理动作:对符合查找条件的文件做出的操作,例如,删除等操作,默认输出至标准输出。
匹配标准:
-name “pattern“ 示例:[root@localhost ~]# find /etc/ -name "passwd" 对文件名进行精确匹配。
-iname “pattern“ 但是匹配时是不区分大小写的 示例:[root@localhost ~]# find /etc/ -name "passwd"
支持glob风格的通配符。*,?,[],[^]
-regex pattern 基于正则表达式,来进行文件名匹配。
根据文件的属主来查找。
-user USERNAME:查找属主指定用户的所有文件。
-group group:查找属组指定组的所有文件。[root@localhost ~]# find /tmp/ -group root
-uid UID:查找属主指定UID的所有文件。 一个用户被删除后,此前所有属于这个用户的文件的属主就是这个用户此前的ID号。
-gid GID:查找属组指定的GID的所有文件。
-nouser:查找没有属主的文件。
-nogroup:查找没有属组的文件。
根据文件的类型查找:
-type:TYPE:
f:普通文件,d:目录文件,I:符号链接文件,b:块设备文件,c:字符设备文件, p:管道文件,s:套接字文件。
根据文件大小来查找:
-size
[+|-]#k,大于多少k,小于多少K。
[root@localhost ~]# find /etc -size +1M -ls 寻找大于1M的文件。
组合条件,同时满足多个条件。
与:-a 。默认组合逻辑,
或:-o
非:-not
[root@localhost ~]# find /tmp -user root -a -type d -ls 查找tmp下属主为root,类型是d的文件。
[root@localhost ~]# find /tmp -user root -a -not -type d -ls 查找tmp下属主为root,类型不是d的文件。
[root@localhost test]# find ./ -not -user user1 -a -not -user user2 -ls 查找属主不是user1和user2的文件。
[root@localhost test]# find ./ -not -user user1 -o -not -type d 属主不是user1或者类型不是目录的文件。
根据文件的时间戳查找:
-mtime 修改时间
-ctime 改变时间
-atime 访问时间
-5 0-5天, +5:5天以前都算。 5:5天以前,5天之内没有记录。
-mmin,cmin,amin,多少分钟。
根据文件的权限进行查找
-perm MODE
find ./ -perm 644 权限的3个数必须精确匹配。
find ./ -perm +644 权限的3个数,任意一位的权限大于644就可以。
find ./ -perm -644 权限大于644的都可以。
运作:
-print:显示
-ls:类似ls -l 显示每一个文件的详细信息。
-ok COMMAND { } \; 查找到文件,希望在这个查找的文件上执行其它命令。此处{ }做为文件名(find查找出来的文件名称)称占位符。
-exec COMMAND { } \;
-ok和-exec的区别:-ok的每一个操作都需要用户确认。有交互进程。
[root@localhost test]# find ./ -perm -006 -exec chmod o-w {} \; 找见其它用户有写权限的文件,之后把它的其它用户的W权限去除。
[root@localhost test]# find ./ -type d -ok chmod +x {} \; 找到类型是目录的文件,让他的属主,属组,其它用户的权限都有x的权限。
[root@localhost test]# find ./ -perm -020 -exec mv {} {}.new \; 找到属组有x权限的文件,将文件名在原有文件的后面加上.new。
[root@localhost ~]# find ./ -name "*.sh" -a -perm -111 -exec chmod 0-x {} \; 找到名称以.sh结尾的,所有用户都有执行权限的,将其它用户的执行权限去掉。
练习:
1./tmp目录下属主为非root的所有文件。
[root@localhost ~]# find /tmp -not -user root -ls
2./tmp目录下文件名中不包含fstab字符串的文件。
[root@localhost ~]# find /tmp -not -iname *fstab -ls
3./tmp目录下属主为非root,而且文件名不包含fstab字符串的文件。
root@localhost ~]# find /tmp -not -user root -a -not -iname *fstab -ls
根据文件大小查找:
-size[+·-]#UNIT 常用单位:K,M,G。
UNIT的取值(大于UNIT-1,小于等于UNIT)
- UNIT的取值0 到UNIT-1的区间。
+UNIT的取值UNIT到无穷大。
根据时间戳查找:
以天为单位:
-atime:[+|-]
-mtime -ctime
以分钟为单位:
find命令需要执行额外的命令,可以使用-exec,-ok,-xargs。
xargs:
[root@localhost ~]# find /etc -size +1M | xargs echo {} >> /tmp/etc.largefiles
[root@localhost ~]# find /etc -size +1M | xargs echo {} >> /tmp/etc.largefiles \;