随堂练习 find
find 是实时查找工具,通过遍历指定路径完成文件查找。
工作特点:
1)查找速度略慢
2)精确查找
3)实时查找
4)查找条件丰富
5)可能只搜索用户具备读取和执行权限的目录
格式:
find [OPTTON]...[查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录。
查找条件:指定的查找标准,可以文件名,大小,类型,权限等标准进行;默认为找出指定路径下的所有文件。
处理动作:对符合条件的文件做操作,默认输出至屏幕。
1,指定搜索目录层级
-maxdepth 最大搜索目录深度,指定目录下的文件为1级。
-mindepth 最小搜索目录深度。
范例:
find /etc -maxdepth 2 -mindepth 2
2,对每个目录先处理目录内的文件,在处理目录本身
-depth -d
范例:
find /data/test -depth
3,根据文件名和iNode查找
-name "文件名称":支持使用glob;如:*,?,[],[^],通配符要加双引号引起来
-iname "文件名称":不区分字母大小写
-inum n 按iNode号查找
-samefile name 相同iNode号的文件
-links n 链接数为 n 的文件
-regex "PATTERN":以PATTERN匹配整个文件路径,而非文件名称
范例:
find -name test.png
find -iname test.png
find / -name ".txt"
find /var -name "log*"
find -regex ".*\.txt$"
4,根据属主,属组查找
-user USERNAME:查找属主为指定用户(UID)的文件
-group GRPNAME:查找属组为指定组(GID)的文件
-uid UserID:查找属主为指定的UID号的文件
-gid GroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
5,根据文件类型查找
-type 可以是以下形式:
f:普通文件
d:目录文件
l:符号链接文件
s:套接字文件
b:块设备文件
c:字符设备文件
p:管道文件
范例:
1)查找/home的目录
find /home -type d -ls
2)空文件或目录 -empty
find /apps -type d -empty
3)组合条件
与:-a ;默认多个条件是与关系
或:-o
非:-not !
范例:
find /etc/ -type d -o -type l | wc -l
find /etc/ \(-type d -o -type l \) -ls | wc -l
德·摩根定律:
1)(非A)或(非B)= 非(A且B)
2)(非A)且(非B)= 非(A或B)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
范例:
find -user long -group long
find -user long -not -group long
find -user long -o -user ling
find -not \( -user long -o -user ling \)
find / -user long -o -uid 500
find ! \( -type d -a -empty \) | wc -l
find ! -type d -o ! -empty | wc -l
find ! -user long ! -user lan
1)找出/tmp目录下,属主不是root,且文件名不以f 开头的文件
find /tmp -not ( -user root -o -name 'f*' ) -ls
6,排除目录
范例:
1)查找/etc/下,除/etc/sane.d目录的其他所有.conf后缀的文件
find /etc -path '/etc/sane.d' -a -prune -o -name "*.conf"
2),查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的所有.conf后缀的文件
find /etc \( -path "/etc/sane.d" -o -path "/etc/fonts" \) -a -prune -o -name "*.conf"
3),排除/proc和/sys目录
find / \( -path "/sys" -o -path "/proc" \) -a -prune -o -type f -a -mmin -1
7,根据文件大小来查找
-size [+|-] #UNIT
常用单位:k,M,G,c(byte),注意大小写敏感
#UNIT:(#-1,#)
如:5k 表示(4k,5k]
-#UNIT:[0,#-1]
如:-5k 表示[0,4k]
+#UNIT:(#,∞)
如:+5k 表示(5k,无穷大)
范例:
find / -size +10G
8,根据时间戳
#以天为单位
-atime [+|-]#
-mtime
-ctime
#:[#,#+1)
+#:[#+1,无穷大]
-#:[0,#)
#以分钟为单位
-amin
-mmin
-cmin
9,根据权限查找
-perm [/|-]MODE
MODE:精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可;或关系,+ 从CentOS7开始淘汰
-MODE:每一类对象都必须同时拥有指定权限;与关系
0 表示不关注
说明
find -perm 755 会匹配权限模式恰好是755的文件
只要当任意人有写权限时,find -perm /222 就会匹配
只有当每个人都有写权限时,find -perm -222 才会匹配
只有当其他人(other)有写权限时,find -perm -002 才会匹配
10,处理动作
-print:默认的处理动作,显示至屏幕
-ls:类似于对查找到文件执行 “ls -l”命令
-fls file:查找到的所有文件的长格式信息保存至指定文件中,相当于 -ls > file
-delete:删除查找到的文件,慎用!
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
{}:用于引用查找到的文件名称自身
范例:
1)备份配置文件,添加.log这个扩展名
find -name ".conf" -exec cp {} {}.log \;
2)提示删除存在时间超过3天以上的 long的临时文件
find /tmp -ctime +3 -user long -ok rm {} \;
3)在主目录中寻找可被其他用户写入的文件
find ~ -perm -002 -exec chmod o-w {} \;
4)查找 /data下的权限为644 ,后缀为sh 的普通文件,增加执行权限
find /data -type f -perm 644 -name "*.sh" -exec chmod +755 {} \;
11,参数替换 xargs
由于很多命令不支持管道| 来传递参数,xargs用于产生某个命令的参数,xargs可以读入stdin的数据,并且以空格符或回车符将stdin的数据分隔成为参数,另外许多命令不能接受过多参数,命令执行可能会失败,xargs可以解决
注意:文件名或者是其他意义的名词内含有空格符的情况
find 经常和 xargs 命令进行组合,形式如下:
find | xargs COMMAND
范例:
1)显示10个数字
seq 10 | xargs
2)删除当前目录下的大量文件
ls | xargs rm
3)对文件排序显示
find -name "*.sh" | xargs ls -Sl
4)批量创建和删除用户
echo user{1..10} | xargs -n1 useradd
echo user{1..10} | xargs -n1 userdel -r
5)这个命令是错误的
find /sbin/ -perm /700 | ls -Sl
6)查找特殊权限的文件,并排序
find /bin/ -perm /7000 | xargs ls -Sl
7)此命令和上面的有何区别
find /bin/ -perm -7000 | xargs ls -Sl
8)以字符nul分隔
find -type f -name "*.txt" -print0 | xargs -0 rm
9)并发执行多个进程
seq 100 | xargs -i -P10 wget -P /data http://10.0.0.100/{}.html