find 文件查找工具
\ > Linux资深运维工程师必会文件查找工具之一
查找:在文件系统上,按某种条件,查找符合条件的文件;并非是文本内容过滤(grep)
文件系统:倒置的树状结构;管理文件;
文件:有边界的在磁盘上的一段流式数据;
linux上文件查找工具实现:locate, find
locate工具:根据事先构建的索引库查找;
- 速度快:查找数据库完成;类似whatis查找方式;
- 模糊查找:文件系统中的某个路径中存在此字串即符合;
- 非实时查找:查找到的内容只能是构建数据库那一刻之前所有的内容;
\ > 查找时性能好,但构建索引库需要遍历整个根文件系统,极消耗资源;
locate命令使用:
locate [OPTION]… PATTERN…
-b 仅匹配路径中的基名; -c, --count: 统计显示符合条件的文件数量 -r, --regexp REGEXP:使用BRE编写模式;
- 搜索文件系统上passwd文件;
~]# locate -b -r "^passwd$" /etc/passwd /etc/pam.d/passwd /usr/bin/passwd /usr/share/bash-completion/completions/passwd 统计,以上查找文件的数目: ~]# updatedb
find工具:实时查找,遍历指定起始路径下文件系统层级结构完成文件查找
- 速度略慢:在用户给定的指定目录下进行遍历查找
- 精确查找:匹配路径的基名;且精确匹配;
- 实时查找:查找文件是此刻文件的状态;
ps:现在硬件越强,查找精确性足以抵消查找速度降低的时间。
find命令使用:
find [OPTION]… [查找起始路径] [查找条件] [处理动作]
- OPTION: -maxdepth:查找指定起始路径下的路径深度;
- 查找起始路径:指定具体搜索目标起始路径;默认为当前目录;
- 查找条件:指定查找标准;默认找出指定路径下所有文件;(目录也是文件)
- 处理动作:对符合条件的文件做出的操作;默认显示至标准输出;
查找条件:
文件名:
基名匹配: glob
-name "GLOB" -iname "GLOB"
完整路径名匹配: REGEX
-regex "PATTERN" -iregex "PATTERN"
查找/etc起始路径下passwd的所有文件;
[root@localhost ~]# find /etc -name "passwd" /etc/passwd /etc/pam.d/passwd
查找文件系统下包含shadow的所有文件:
[root@localhost ~]# find / -regex ".*shadow.*" /usr/share/doc/shadow-utils-4.1.5.1/NEWS
从属关系:
查找属主为指定用户的所有文件;
-user USERNAME
属组为指定组
-group GROUPNAME
查找属主为指定UID的所有文件;
-uid UID
属组为指定UID
-gid GROUPID
没有属主的所有文件;
-nouser
没有属组的所有文件;
-nogroup
查找/tmp目录下属主为centos的所有文件:
[root@localhost ~]# find /tmp -user centos
查找/tmp目录下属组为fedora的所有文件;
[root@localhost ~]# find /tmp -group fedora
查找/tmp目录下属主为502的所有文件:
[root@localhost ~]# find /tmp -uid 502
查找/tmp目录下属组为520的所有文件:
[root@localhost ~]# find /tmp -gid 520
查找文件系统没有属主的所有文件:
[root@localhost ~]# find / -nouser
查找文件系统没有属组的所有文件:
[root@localhost ~]# find / -nogroup
类型:
普通文件,regular file;
-type f
目录文件,directory;
-type d
块设备文件,block;
-type b
字符设备文件,character;
-type c
链接文件,symbolic;
-type l
套接字文件,socket;
-type s
命名管道,pipe(name);
-type p
查找/tmp目录下所有目录文件;
[root@localhost ~]# find /tmp -type d
查找/etc目录下所有符号链接文件;
[root@localhost ~]# find /etc -type l
查找/dev目录下所有块设备;
[root@localhost ~]# find /dev -type b
组合:
与:-a,默认组合逻辑;同时满足条件才满足;
或:-o,被查找的文件,只要二者符合其中之一,即可满足条件;与-ls连用,需要将或的整体加 (A -o B)
非:-not, !
组合条件遵循“摩根定律”:
查找文件系统下不是root用户的所有文件:
[root@localhost ~]# find / ! -user root
查找文件系统下不是mygrp组的所有文件:
[root@localhost ~]# find / ! -group mygrp -ls
查找文件系统下不是root用户,且不是mygrp组的所有文件:
[root@localhost ~]# find / ! -user root -a ! -group mygrp -ls 可以写作:[root@localhost ~]# find / ! \( -user root -o -group mygrp \) -ls
查找文件系统下没有属组或属主的所有文件:
[root@localhost ~]# find / \( -nogroup -o -nouser \) -ls [root@localhost ~]# find / -nogroup -o -nouser -ls 注意:加括号匹配整体,不加括号只匹配-nouser条件;
找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件;
[root@localhost ~]# find /tmp -not \( -user root -o -name "passwd" \) -ls
根据文件大小查找:
精确查找;(#-1,#]
-size #[KMG]
小于指定值[0,#-1]
-size -#[KMG]
大于指定值(#,+无穷)
-size +#[KMG]
查找/tmp目录下为1k的所有文件
[root@localhost ~]# find /tmp -size 1k -ls 注意:对应目录下文件不足1k也会显示
根据时间戳查找:以”天”为单位:
距离现在有#天; (#+1,#]
-atime # 或 -mtime #
-#: 距离现在小于#天;(#,至今]
-atime -# 或 -mtime -#
+#: 距离现在大于#天:(负无穷,#+1]
-atime +# 或 -mtime +#
查找/tmp目录下7天内访问过所有文件:
[root@localhost ~]# find /tmp -atime -7 -ls
根据时间戳查找:以”分钟”为单位:
距离现在有#分钟; (#+1,#]
-amin # 或 -mmin #
-#: 距离现在小于#分钟;(#,至今]
-amin # 或 -mmin -#
+#: 距离现在大于#分钟:(负无穷,#+1]
-amin # 或 -mmin +#
24小时(86400秒)内修改过:
# find /etc -mtime -1
查找/tmp目录下30分钟内修改过的所有文件;
[root@localhost ~]# find /tmp -mmin -30 -ls
根据权限查找:
至少为此权限;
-perm -MODE
满足三类用户的一位权限,即可;
-perm /MODE 666: rw-rw-rw- 表示:属主有r或w即满足,属组有r或w即满足,其他有r或w即满足 \> r--------: 属主有r,满足; \> ----w----: 属组有w,满足;
精确匹配;
-perm MODE
查找/etc目录下都有执行权限的普通文件;
[root@localhost ~]# find /etc -perm -111 -a -type f
查找/etc目录下都没有执行权限的目录:
[root@localhost ~]# find /etc ! -perm /111 -a -type d -ls
查找/etc目录下至少有一类用户有写权限的所有文件;
[root@localhost ~]# find /etc -perm /222 -ls
查找/etc目录下至少有一类用户没有写权限的所有文件;
[root@localhost ~]# find /etc ! -perm -222 -ls
处理动作:
-print:默认动作;显示输出至标准输出;
[root@localhost ~]# find [root@localhost ~]# find -print
-ls: 类似于对查找到的文件执行”ls -l”命令,输出文件的详细信息;
注意:或条件时仅显示ls前的条件; [root@localhost ~]# find /tmp \( -nouser -o -nogroup \) -ls
-delete: 删除查找到的文件;
[root@localhost ~]# find /tmp \( -nouser -o -nogroup \) -delete
-fls /PATH/TO/SOMEFILE: 把查找到的所有文件的长格式信息保存至指定文件中;
[root@localhost ~]# find / \( -nouser -o -nogroup \) -fls /root/find.fls
-ok COMMAND {} \; :表示对查找到的每个文件执行由此处COMMAND表示的命令;每次操作都由用户进行确认;
[root@localhost ~]# find / \( -nouser -o -nogroup \) -ok rm {} \; < rm ... /home/fedora > ? y rm: cannot remove ‘/home/fedora’: Is a directory
-exec COMMAND {} \; :表示对查找到的每个文件执行由此处COMMAND表示的命令;
{} 引用找到的每一行(文件的文件名) \; 固定格式 # find . -perm -002 -exec mv {} {}.danger \; 注意:find传递查找到的文件路径至后面的命令时,是先查找出符合条件的文件路径,并一次性传递给后面的命令; 但有些命令不能接受过长的参数,此时命令执行会失败,另一种方式可规避此问题; find | xargs -I {} COMMAND {}
1、查找/var目录下属主为root,且属组为mail的所有文件或目录;
# find /var -user root -a -group mail
2、查找/usr目录下不属于root, bin或hadoop的所有文件或目录;用两种方法;
# find /usr -not \( -user root -o -user bin -o -user hadoop \)
# find /usr -not -user root -a ! -user bin -a ! -user hadoop
3、查找/etc/目录下最近一周内其内容修改过,且属主不是root用户也不是hadoop用户的文件或目录;
# find /etc -mtime -7 -a ! -user root -a ! -user hadoop
4、查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录;
# find / -nouser -o -nogroup -a -atime -7
5、查找/etc目录下大于1M且类型为普通文件的所有文件
# find /etc -size +1M -a -type f -exec ls -lh {} \;
6、查找/etc目录下所有用户都没有写权限的文件;
# find /etc ! -perm /222 -a -type f
都有:-222
都没有:加否定,且变或! /222
7、查找/etc目录至少有一类用户没有执行权限的文件;
# find /etc ! -perm -111 -a type f
至少有一类用户有执行:/111
加否定,或变且:! -111
8、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的所有文件;
# find /etc/init.d -perm -113 -a -type f
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/88251