Linuxfind命令详解
⽂章⽬录
⼀、find基本介绍与命令格式
1.find命令基本介绍     find顾名思义就是查,find命令主要沿着⽬录结构依次向下遍历,匹配符合条件的⽂件,可以附带执⾏相应的操作选项,默认的操作结果是打印出符合条件的⽂件与⽬录。如果使⽤该命令时,不设置任何参数,则 find 命令将在当前⽬录下查⼦⽬录与⽂件。并且将查到的⼦⽬录和⽂件全部进⾏显⽰
2.find命令基本信息: 命令名称:find 英⽂原意:search for files in a directory hierarchy. 所在路径:/bin/find 执⾏权限:所有⽤户功能描述:在⽬录中查⽂件
3.find命令格式 find 搜索路径 [选项] 搜索内容 [输出处理形式]
⼆、find命令参数
更多的⽤法可以通过man find命令去查看
1.关于Linux底下三种时间的简单介绍: ①atime
access time,显⽰的是⽂件中的数据最后被访问的时间,⽐如系统的进程直接使⽤或通过⼀些命令和脚本间接使⽤。(执⾏⼀些可执⾏⽂件或脚本)
②mtime
modify time,显⽰的是⽂件内容被修改的最后时间,⽐如⽤vim编辑时就会被改变。(也就是Block的内容)
③ctime
change time,显⽰的是⽂件的权限、拥有者、所属的组、链接数发⽣改变时的时间。当然当内容改变时也会随之改变(即inode内容发⽣改变和Block内容发⽣改变时)
2.参数表
参数描述
-name按⽂件名查⽂件,⽂件名在参数后⾯
-iname根据⽂件名查,不区分⼤⼩写
-
perm按权限查⽂件
-user按属主查⽂件
-group按属组查⽂件
-uid按⽤户uid查⽂件
-gid按⽤户gid查⽂件
-nouser查⽆有效属主的⽂件,即/etc/passwd⽂件中不存在该属主
-nogroup查⽆有效属组的⽂件,即/etc/group⽂件中不存在该属组
atime按⽂件访问时间查⽂件,-n指n天以内,+n指n天以前,n是整数
-mtime按⽂件更改时间查⽂件,-n指n天以内,+n指n天以前,n是整数
-ctime按⽂件属性改变时间查⽂件,如⽂件的权限、属主、属组等,-n指n天以内,+n指n天以前,n是整数
-amin按⽂件访问时间查⽂件,-n指n分钟以内,+n指n分钟以前,n是整数
-amin按⽂件访问时间查⽂件,-n指n分钟以内,+n指n分钟以前,n是整数
-mmin按⽂件更改时间查⽂件,-n指n分钟以内,+n指n分钟以前,n是整数
-cmin按⽂件属性改变时间查⽂件,如⽂件的权限、属主、属组等,-n指n分钟以内,+n指n分钟以前,n是整数
-newer以⽂件更改时间作为范围查⽂件,⽤法:-newer f1 !f2 表⽰查⽂件更改时间⽐⽂件f1新,但⽐⽂件f2旧的⽂件
-type 按⽂件类型查⽂件,⽂件类型有f/d/l/b/c/p/s,分别是普通⽂件/⽬录/链接⽂件/块设备⽂件/字符设备⽂件/管道⽂件/套接字,socket⽂
-size 按⽂件⼤⼩查⽂件,单位有cwbkMG,c:字节、w:字 (2字节)、b:代表 512 位元组的区块(如果⽤户没有指定后缀,则默认为b)、k:表⽰ kilo bytes (1024字节)、M:兆字节(1048576字节)、G:千兆字节 (1073741824字节)
-depth在查⽂件时,⾸先查当前⽬录中的⽂件,然后再在其⼦⽬录中查,当指定-delete⾏为时,
会⾃动应⽤这个选项。-fstype查位于某⼀类型⽂件系统中的⽂件,这些⽂件系统类型通常可 在/etc/fstab中到
-mount查⽂件时不跨越⽂件系统mount点
-follow如果find命令查遇到符号链接⽂件,就跟踪⾄链接所指向的⽂件
-cpio对匹配的⽂件使⽤cpio命令,将这些⽂件备份到磁带设备中
-path指定字符串作为寻⽬录的范本样式
-prune 使⽤这⼀选项可以使find命令不在当前指定的⽬录中查,如果同时使⽤了- depth选项,那么-prune选项将被find命令忽略,由于-delete暗
含-depth,因此⽆法有效地同时使⽤-prune和-delete
-empty搜索空⽂件或空⽬录
-
maxdepth
查最⼤⽬录层数(最⼤深度),如:-maxdepth 1,即只查⼀层⽬录
-mindepth 查最⼩⽬录层数(最⼩深度)
参数描述
三、操作符
操作符号⽤来表⽰查条件之间的逻辑关系
-and 表⽰的是与关系,如果该操作符两边的查条件为真,则条件成⽴,匹配⽂件。可以简写为-a。注意:如果多个查条件之间没有使⽤操
作符,则默认使⽤的是-and
-or表⽰的是或关系,如果该操作符两边的查条件有任意⼀个为真,则条件成⽴,匹配⽂件。可以简写为-o -not表⽰取反,如果操作符后⾯的查条件为真,则反向匹配该查条件,可以简写为!
()该操作符可以将查条件与操作符组合起来形成更⼤的表达式。这⽤来控制逻辑计算的优先级。默认情况下,find命令按照从左到右的顺序执⾏,经常有必要重写默认执⾏顺序来得到想要的查询条件,即
使没有必要使⽤圆括号的时候使⽤圆括号将查条件包括起来对提⾼命令的可读性是很有帮助的。注意:因为圆括号字符对于shell来说有特殊的含义,所以在命令⾏使⽤的时候,需要⽤引号引起来才能作为实参传递给find命令。不过我们通常使⽤反斜杆(\)⽤来转义圆括号字符,需要注意的是,括号两边与括号内部u命令之间需要空格,'\(','\)'。可能直接⽂字描述我不好说清楚,你也不好
理解,那么请看后⾯的实例吧
四、⽂件名通配符
按照本⼈理解,就是相当于shell基本正则
*:通配任意的字符,表⽰任何字符
:表⽰任意单个字符
[]:⽰通配括号⾥⾯的任意⼀个字符,注意[]⾥⾯的内容会被解析成单个字符
五、输出处理形式
参数描述
-
print将⽤find命令到的⽂件输出到标准输出,格式为每列⼀个名称,每个名称之前皆有"./"字符串,如果查出来的⽂件太多,建议使⽤此参数
-print0⽂件或⽬录名称列出到标准输出,格式为全部的名称皆在同⼀⾏-printf
将⽂件或⽬录名称列出到标准输出。格式可以⾃⾏指定,命令格式:-printf<;输出格式>-fprint
此参数的效果和指定"-print"参数类似,但会把结果保存成指定的列表⽂件,命令格式:-fprint<;列表⽂件>-
fprint0
此参数的效果和指定"-print0"参数类似,但会把结果保存成指定的列表⽂件,命令格式:-fprint0<;列表⽂件>-
fprintf
此参数的效果和指定"-printf"参数类似,但会把结果保存成指定的列表⽂件,命令格式:-fprintf<;列表⽂件><;输出格式>-ls
find查命令的使用对匹配的⽂件执⾏ls -dils命令,并且将结果发送到标准输出-quit
查到⼀个⽴刻退出-delete
删除当前匹配的⽂件-used
查⽂件或⽬录被更改之后在指定时间曾被存取过的⽂件或⽬录,单位以⽇计算,命令格式:-used <;天数>-exec 对find命令所匹配到的⽂件执⾏该参数所给出的shell命令,命令格式为:-exec 命令 {} \;,注意⼤括号要与\保持空格,最后⾯是以;结尾
-ok
和-exec的作⽤相同,不同的是-ok以⼀种更为安全的模式来执⾏该参数所给出的shell命令,在执⾏每⼀个命令之前,都会给出提⽰,让⽤户来确
定是否执⾏,如果需要执⾏,⽤户输⼊y,然后回车即可
|
xargs 这⾥本来不想加⼊|的,但是xargs⼀般都是与|⼀起使⽤的,还是加上吧。。。,与-exec作⽤相同 ,但是为什么有-exec了还要| xargs 呢?原
因是:①在使⽤ find命令的-exec选项处理匹配到的⽂件时, find命令将所有匹配到的⽂件⼀起传递给exec执⾏。但有些系统对能够传递给exec
的命令长度有限制,这样在find命令运⾏⼏分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出 ②exec是要等find命
令执⾏完成之后才对find执⾏完成的结果进⾏操作,然⽽很不幸的是当⽂件太多的时候会出现⽂件队列过长的提⽰,这是应为linux有个临时内存地址只保存128K的数据,我们有个服务器⽬录中有超量的⽂件例如1万份⽂件,,要对其进⾏分类,使⽤exec就不⾏,这时候就需要⽤到xargs ③管道实现的是将前⾯的stdout(标准输出)作为后⾯的stdin(标准输⼊),但是有些命令不接受管道的传递⽅式,最常见的就是ls命令。有些
时候命令希望管道传递的是参数,但是直接⽤管道有时⽆法传递到命令的参数位,这时候需要xargs,xargs实现的是将管道传输过来的stdin进⾏
处理然后传递到命令的参数位上。也就是说xargs完成了两个⾏为:处理管道传输过来的stdin;将处理后的传递到正确的位置上,⽽且xargs的作
⽤不仅仅限于简单的stdin传递到命令的参数位,它还可以将stdin或者⽂件stdin分割成批,每个批中有很多分割⽚段,然后将这些⽚段按批交给
xargs后⾯的命令进⾏处理,这也就是为什么xargs命令⼀般与管道连⽤的原因了
参数
描述六、实例
实例1:按⽂件名查
实例2:按权限查
1.查/etc /⽬录下⽂件名为passwd 的⽂件
[root @test1 ~]#find /etc / -name passwd -print
/etc /passwd
/etc /pam .d /passwd
2.查/etc /⽬录下⽂件名以.conf ⽂件结尾的⽂件
[root @test1 ~]#find /etc / -name *.conf -print | more
/etc /ld .so .conf
/etc /vsftpd /vsftpd .conf
...省略后⾯的内容...
实例3:按属主和属组查实例4:按⽤户gid,uid查⽂件 查看⽤户uid、gid [root@test1 ~]#id ops uid=1007(ops) gid=1007(ops) groups=1007(ops)-
perm 表⽰权限-perm 444  # 查⽂件权限为444的⽂件(精确查,⽂件权限必须为444)
-perm -444  # "-"表⽰与关系,查⽂件权限中u 位有r 权限,并且g 位有r 权限,并且o 位有r 权限的⽂件
-perm /444  # "/"表⽰或关系,查⽂件权限中u 位有r 权限,或者g 位有r 权限,或者o 位有r 权限的⽂件
-
perm /777  # 777=rwx rwx rwx 即9个条件中满⾜任意⼀个即可
1.查/etc /⽬录下⽂件权限为444的⽂件
[root @test1 ~]#find /etc / -perm 444 -print |xargs ls -l | more
-r --r --r --  1 root root      63 Jul  4  2017 /etc /ld .so .conf .d /kernel -3.10.0-514.26.2.el7.f
-r --r --r --. 1 root root      63 Nov 23  2016 /etc /ld .so .conf .d /kernel -3.10.0-514.el7.f
-r --r --r --  1 root root    531 Mar 25  2020
...以下内容省略...
2.查/etc /⽬录下⽂件权限为
[root @test1 ~]#find /etc / -perm 755 -print |xargs ls -l | more
-rwxr -xr -x .  1 root root  618 Mar 18  2014 /etc /cron .daily
/man -db .cron
-
rwxr -xr -x    1 root root  409 Dec  7  2016 /etc /dhcp /dhclient .d /chrony .sh
-rwxr -xr -x    1 root root  2227 Apr 12  2017 /etc /dhcp /dhclient .d /ntp .sh
...以下内容省略...
3.给/mnt 下⽂件权限包含404的⽂件的g 位加w 的权限
[root @test1 ~]#find /mnt -perm 404 -exec chmod g +w {} \;
1.查/mnt /⽬录下⽂件属主为ops 的⽂件
[root @test1 ~]#find /mnt / -user ops -print
2.查/mnt /⽬录下⽂件属组为ops 的⽂件
[root @test1 ~]#find /mnt / -group ops -print
3.查/mnt /⽬录下⽂件的属主与属组都为ops 的⽂件(逻辑关系默认为并且)
[root @test1 ~]#find /mnt / -user ops -group ops -print
-a 表⽰并且(与),-and 的简写,所以也可以这样写
[root @test1 ~]#find /mnt / -user ops -a -group ops -print
4.查/mnt /⽬录下⽂件的属主或属组为ops 的⽂件
-o 表⽰或者,是-or 的简写
[root @test1 ~]#find /mnt / -user ops -o -group ops -print
5.查/mnt /⽬录下⽂件属主不是ops 的⽂件
-not 表⽰反向匹配,取反,可以简写为!
[root @test1 ~]#find /mnt / -not -user ops -print
6.查/mnt /⽬录下⽆有效属主的⽂件,即该⽂件的属主在/etc /passwd 中不存在
[root @test1 ~]#find /mnt / -nouser -print
7.查/mnt /⽬录下⽆有效所属组的⽂件,即该⽂件所属的组在/etc /groups 中不存在
[root @test1 ~]#find /mnt / -nogroup -print
8.在整个系统中查既没有属主⼜没有属组的⽂件(这样的⽂件通常是很危险的,作为系统⼯程师的我们应该及时清除掉)
[root @test1 ~]#find / -nouser -a -nogroup
实例5:按时间查⽂件(atime、mtime、ctime、amin、mmin、cmin,以⽂件更改时间作为范围) 我们可以使⽤stat命令来查看⼀个⽂件的时间信息
实例6:按⽂件类型查⽂件
实例7:按⽂件⼤⼩查⽂件 -size 20K    #查⼤⼩为20K的⽂件 -size -20K    #-表⽰⼩于;查⽐20K⼩的⽂件 -size +20k    #+表⽰⼤于;查看⽐20K⼤的⽂件
单位: c:字节 w:字 (2字节) b:代表 512 位元组的区块(如果⽤户没有指定后缀,则默认为 b) k:表⽰ kilo bytes (1024字节) M:兆字节(1048576字节) G:千兆字节 (1073741824字节)
1.根据⽤户uid 查⽂件
[root @test1 ~]#find / -uid 1007 -print | more
2.根据⽤户gid 查⽂件
[root @test1 ~]#find / -gid 1007 -print | more 1.
查当前⽬录当天修改过的⽂件(列出了两种⽅法)
[root @test1 ~]#find ./ -mtime -1 -type f -print |xargs ls -l
[root @test1 ~]#find ./ -mtime -1 -type f -exec ls -l {} \;
2.查当前⽬录当天修改过的⽂件并询问是否要显⽰
[root @test1 ~]#find ./ -mtime -1 -type f -ok ls -l {} \;
3.在/mnt /⽬录下查更改时间在5⽇以前的⽂件并删除它们
[root @test1 ~]#find ./ -type f -mtime +5 -exec rm {} \;
4.删除在/mnt /⽬录下查到的超过30天没有访问过⽂件并删除它们[root
@test1 ~]#find /mnt -atime  +30 –exec rm –rf  {} \;
-atime 、-ctime 等的使⽤⽅法与mtime 差不多,这⾥就不⼀⼀罗列了
f 表⽰普通⽂件
[root @test1 ~]#find /dev -type f -print
d 表⽰⽬录
[root @test1 ~]#find /dev -type d -print
l 表⽰链接⽂件
[root @test1 ~]#find /dev -type l -print
b 表⽰块设备⽂件
[root @test1 ~]#find /dev -type b -print
c 表⽰字符设备⽂件
[root @test1 ~]#find /dev -type c -print
p 表⽰管道⽂件
[root @test1 ~]#find /dev -type p -print
s 表⽰套接字,socket ⽂件
[root @test1 ~]#find /dev -type s -print