find 命令
2019-04-28 本文已影响0人
赛亚人之神
工作特点:
查找速度略慢:
精确查找:
实时查找:
语法:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
可以总结为如下命令:
find [OPTION]... [查找路径]... [查找条件] [处理动作]
查找路径:指定具体目标路径,默认为当前目录
查找条件:指定的查找标准,可以是文件名、大小、类型、权限等标准进行,默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做什么操作,默认输出至屏幕
1. 查找条件
1)根据文件名查找
-name "文件名称",支持使用 glob
*, ?, [], [^]
-iname "文件名称",不区分字母大小写
-regex "PATTERN",以 PATTERN 匹配整个文件路径字符串,而不仅仅是文件名称
2)根据属主、属组查找:
-user Username: 查找属主为指定用户的文件
-group Groupname: 查找属组为指定组的文件
例如:
cp /etc/fstab /tmp; chown root:grandkai /tmp/fstab
find /tmp -user root -ls
find /tmp -group root -ls
注意: 如果用户被删除,那么文件的属主会被显示为 UID,而不是用户名,此时可以使用 -uid, -gid 进行查找
-uid UserID: 查找属主为指定UID号的文件
-gid GroupID: 查找属组为指定GID号的文件
-nouser: 查找没有属主的文件
-nogroup: 查找没有属组的文件
通常用于用户,用户组被删除的情况,以确保系统安全
3)根据文件类型查找:
-type TYPE:
b:块设备文件
c:字符设备文件
d:目录文件
f:普通文件
l:符号链接文件
p:管道文件
s:套接字文件
4)组合条件:
与:-a
或:-o
非:!, -not
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
例子:取出 /tmp 目录下,属主不是 root,且文件名不是 fstab 的文件
1. find /tmp \( -not -user root -a -not -name fstab \) -ls
2. find /tmp -not \( -user root -o -name fstab \) -ls
注意:如果不加()括起来,那么 ls 命令显示出来的可能不是正确的结果,
假如 /tmp 下存在 fstab 属主为1001,数组为 1003,那么下面的命令显示不出来正确的结果
错误:find /tmp -uid 1001 -o -gid 1003 -ls
正确:find /tmp \( -uid 1001 -o -gid 1003 \) -ls
5)根据文件大小来查找:
-size [+|-]#UNIT
常用单位:k,M,G
#UNIT:(#-1,#]
-#UNIT: [0,#-1]
+#UNIT: (#,∞)
例子:
find /var -size 3k -exec ls -lh {} \;
上面的参数说明:
查找 (2k, 3k] 的文件
如果是 -3k,则查找 [0k,2k] 的文件
如果是 +3k,则查找 (3k,,∞) 的文件
6)根据时间戳来查找:
以“天”为单位:
-atime [+|-]#
#: [#,#+1) 第3天修改的文件(3天前但不到4天)
+#: [#+1,∞] 4天前修改的文件
-#: [0, #) 3天内修改的文件
-mtime
-ctime
以“分钟”为单位:
-amin
-mmin
-cmin
7)根据权限来查找:
-perm [+|-]MODE
MODE: 精确权限匹配
+MODE: 任何一类(u, g, o)对象的权限中只要能一位匹配即可 - 或关系
-MODE: 每一类对象都必须同时拥有为其指定的权限标准 - 与关系
-666
-766 符合
-760 不符合
2. 处理动作:
-print: default,显示至屏幕
-ls: 类似对查找到的文件执行“ls -l” 命令
-delete: 删除查找到的文件
-fls /path/to/somefile 查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {} \; 对查找到每个文件执行由 COMMAND 指定的命令
对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \; 对查找到每个文件执行由 COMMAND 指定的命令
{}: 表示引用查找到的文件名自身
注意: find传递查找到的文件至后面指定的命令时,查找到的所有符合条件的文件一次性传递给后面的命令;
有些命令不能接口过多参数,此时命令执行可能会失败,另一种方式可规避此问题
find | xagrs COMMAND
举例:
1. 将 /tmp 目录下没有属主的文件的属主改为 root
find /tmp -nouser -exec chown root {} \;
2. 将 /tmp 目录下没有属组的文件的属组改为 root
find /tmp -nogroup -ok chown :root {} \;
3. 查找 /tmp 下最近5分钟修改过的文件,并将其重新命名为 .new 文件
find /tmp/ -cmin -5 -exec cp {} {}.new \;
练习:
1. 查找 /var 目录下属主为 root,且属组为 mail 的所有文件或目录
find /var/ -user root -group mail
扩展 - 显示文件目录或权限
find /var/ -user root -group mail -exec ls -l {} \;
2. 查找 /var 目录下不属于 root、bin 或 hadoop 的所有文件或目录
find /var/ -not \( -name root -o -name bin -o -name hadoop \)
3. 查找 /etc 目录下最近一周内其内容修改过,同时属主不为 root,也不属于 hadoop 的文件或目录
find /etc/ \( -ctime -7 -a -user root -a -user hadoop \)
4. 查找当前系统上没有属主或属组,且最近一周内层位访问过的文件或目录
find /etc/ \( -not \( -user root -o -user mysql \) -a -ctime -7 \) -ls
5. 查找 /etc 目录下大于 1M 且类型为普通文件的所有文件或目录
find /etc/ -size +1M -type f -exec ls -lh {} \;
6. 查找 /etc 目录下所有用户都没有写权限的文件或目录
600, 660 666, 006, 066
find /var/ -not \( -perm -666 -o -perm -600 -o -perm -660 -o -perm -006 -o -perm -066 \) -exec ls -l {} \;
7. 查找 /etc 目录下至少有一类用户没有执行权限的文件或目录
8. 查找 /etc/init.d 目录下,所有用户都有执行权限,且其它用户有写权限的文件或目录