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