Linux文件查找之find

发布时间 2023-03-29 00:32:10作者: e-huo

Linux文件查找之find

在文件系统上查找符合条件的文件

一、find的作用

find 是实时查找工具,通过遍历指定路径完成文件查找

1.1 工作特点:

  • 查找速度略慢
  • 精确查找
  • 实时查找
  • 查找条件丰富
  • 可能只搜索用户具备读取和执行权限的目录

1.2 格式

find [OPTION]... [查找路径] [查找条件] [处理动作]

查找起始路径: 指定具体搜索目标起始路径;默认为当前目录;
查找条件:指定的查找标准,可以根据文件名,大小,类型,从属关系,权限等等标准进行;默认为找出指定路径下的所有文件;
处理工作: 对符合查找条件的文件做出的动作,例如删除等操作;默认为输出至标准输出。

二、查找条件

2.1 根据文件名查找

-name "pattern":

-iname "pattern": 不区分大小写

支持glob风格的通配符;
*, ?, [], [^]

-regex pattern: 基于正则表达式模式查找文件,匹配是整个路径,而非其名

-inum n #按inode号查找
-samefile name #相同inode号的文件
-links n #链接数为n的文件

find -name snow.png
find -iname snow.png
find / -name  ".txt"
find /var –name "log*"
[root@centos8 data]#find -regex ".*\.txt$"
./scripts/b.txt
./f1.tx

2.2 根据文件从属关系查找:

-user USERNAME: 查找属主指定用户的所有文件
-group GRPNAME: 查找属组指定组的所有文件

-uid UID: 查找属主指定的UID的所有文件
-gid GID:查找属组指定的GID的所有文件

-nouser :没有属主的文件
-nogroup: 查找没有属组的文件;

例:

1、查找/var目录下属主位root,且属组位mail的所有文件或目录
			find /var -user root -a -group mail -ls

2、查找/usr目录下不属于root,bin或hadoop的所有文件或目录
			find /usr -not \(-user root -o -user bin -o -user hadoop\) -ls
			find /usr -not -user root -a -not -user bin -a -not -user hadoop -ls

2.3 根据文件的类型查找:

-type TYPE
							f:普通文件
							d:目录文件
							l:符号链接文件
							b:块设备
							c: 字符设备文件
							p: 管道文件
							s: 套接字文件

例:

#查看/home的目录
find /home –type d -ls

2.4 组合条件

与:-a ,默认多个条件是与关系,所以可以省略-a
或:-o
非:-not !

例:

[root@centos8 ~]#find /etc/ -type d -o -type l |wc -l
307
[root@centos8 ~]#find /etc/ -type d -o -type l -ls |wc -l
101
[root@centos8 ~]#find /etc/ \( -type d -o -type l \)  -ls |wc -l      #\(\)转义符
307

注:

德·摩根定律:
(非 A) 且 (非 B) = 非(A 或 B)
(非 A) 或 (非 B) = 非(A 且 B)

!A -a !B = !(A -o B)
!A -o !B = !(A -a B)

范例:

1、找出/tmp目录下属主为非root的所有文件;
			find /tmp -not -user root -ls

2、找出/tmp目录下文件中不包含fastb字符串的文件;
			find /tmp -not -iname "fastab" -ls

3、找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件;
			find /tmp -not -user root -a not -iname "*fstab*" -ls
			find /tmp -not \(-user root -o -iname "*fstab*"\) -ls

2.5 排除目录

#查找/etc/下,除/etc/security目录的其它所有.conf后缀的文件
find /etc -path '/etc/security' -a -prune -o -name "*.conf"

#查找/etc/下,除/etc/security和/etc/systemd,/etc/dbus-1三个目录的所有.conf后缀的文件
find /etc \( -path "/etc/security" -o -path "/etc/systemd"  -o -path "/etc/dbus-1" \) -a -prune -o -name "*.conf"

#排除/proc和/sys目录
find / \( -path "/sys" -o -path "/proc" \) -a -prune -o -type f -a -mmin -1

2.6 根据文件的大小查找

-size [+|-]#UNIT #常用单位:k, M, G,c(byte),注意大小写敏感
#UNIT: **#表示(#-1, #]**,如:6k 表示(5k,6k]
-#UNIT **#表示[0,#-1],**如:-6k 表示[0,5k]
+#UNIT **#表示(#,∞)**,如:+6k 表示(6k,∞)

2.7 根据时间戳

#以“天"为单位
-atime [+|-]#

**# #表示[#,#+1)
+# #表示[#+1,∞]
-# #表示[0,#)
-mtime
-ctime**

#以“分钟"为单位
-amin
-mmin
-cmin

**注:find命令认为24小时之内为第0天**

2.8 根据权限查找

-perm [/|-]MODE

MODE  #精确权限匹配
/MODE #任何一类(u,g,o)对象的权限中只要有一位匹配即可,或关系,+ 从CentOS 7开始淘汰
-MODE #每一类对象都必须同时拥有指定权限,与关系
0 表示不关注

注:
**find -perm 755 会匹配权限模式恰好是755的文件
只要当任意人有写权限时,find -perm /222就会匹配
只有当每个人都有写权限时,find -perm -222才会匹配
只有当其它人(other)有写权限时,find -perm -002才会匹配**

三、处理动作

3.1 处理动作

-print:默认的处理动作,显示至屏幕
-ls:类似于对查找到的文件执行"ls -dils"命令格式输出
-fls file:查找到的所有文件的长格式信息保存至指定文件中,相当于 -ls > file
-delete:删除查找到的文件,**慎用!**
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,**都会交互式要求用户确认**
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令{}: 用于引用查找到的文件名称自身

**注意:** find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;但是有些命令不能接受过长的参数,此时命令执行会失败,另一种方式可规避此问题:
					find| xargs COMMAND

例:

#备份配置文件,添加.orig这个扩展名
find  -name  ".conf"  -exec  cp {} {}.orig \;
#提示删除存在时间超过3天以上的joe的临时文件
find /tmp -ctime +3 -user joe -ok rm {} \;
#在主目录中寻找可被其它用户写入的文件
find ~ -perm -002  -exec chmod o-w {} \;
#查找/data下的权限为644,后缀为sh的普通文件,增加执行权限
find /data –type f -perm 644  -name "*.sh" –exec chmod 755 {} \;

案例

#查找当前系统上没有属或属组,且最近一周内曾被访问过的文件或目录;
				find /etc -nouser -o -nogroup -ls  #没有属主或没有属组的显示目录和文件(就近原则)
				find /etc \( -nouser -o -nogroup \) -ls
				find / \(-nouser -o -nogroup )\ -atime -7  -ls

#查找/etc目录下大于1M且类型为普通文件的所有文件;
				find /etc -size +1M -type f -ls
				find /etc -size +1M -type f -exec ls {} \;

#查找/etc目录下所有用户都没有写权限的文件:
				find /etc -not -perm /222 -type f -ls  #至少有一个有

#查找/etc目录至少有一类用户没有执行权限的文件:
				find /etc -not -perm -111 -type f -ls

#查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的所有文件
				find /etc/init.d/ -perm -113 -type f -ls