本文共 5815 字,大约阅读时间需要 19 分钟。
说到了find这个命令,相应的就会想到locate这个命令
locate这个命令也是具有查找的功能,现在我们来了解一下两者之间的差别 locate现在来具体分析一下有关find这个命令的有关选项
首先先看一下有关查找条件的选项搜索层级
find -maxdepth level 最大目录深度,指定目录为第1级 -mindepth level 最小搜索目录深度 搜索目录深度是相对于当前所在目录来说的,现在让我们自己建个目录和文件来看一下
首先,随便进入到一个不会影响系统的目录,我进入到/app下,(将/app里的所有内容删除防止影响接下来的结果显示)然后创建目录
回顾一下之前学过的mkdir:mkdir -p 创建多级目录; mkdir -v 显示创建的具体信息再创建几个文件,为了方便识别,所以这样创建目录和文件好了,现在让我们敲一下这俩个有关查找目录深度的文件find命令 看显示的搜素结果可以知道,-maxdepth 搜索最大目录深度也就是说你敲5意味着最多只搜索到第5级目录不会再向下搜索了,第5级目录是搜索的最终 看这次显示的搜索结果,-mindepth 搜索最小目录深度也就是说你敲2意味着搜索是从第二级目录开始的,然后搜索到最后子目录及子文件如果我说的这些大白话你还没有看明白,不要着急,你自己试着创建然后敲一下命令就很容易理解了
文件名
find -name filename (支持使用通配符) find -iname filename 不区分字母大小写
用find命令查找文件是可以使用通配符的
好,现在看一下这俩条命令,还是在/app里,先把之前创建的都删除,创建几个名字类似的文件个人觉得这俩条命令很容易理解,所以如果你不理解,还是一样,敲一下喽
find -links n 链接数为n的文件
这里的这个链接数指的是硬链接,查看链接数应该用stat这个命令,之前有提过,所指示的位置就是显示的文件的硬链接数
好,这一次我们就不自己创建了,我们直接找一个目录然后查找看一下,我进入/tmp下来随意验证一个文件看是不是硬链接数是2find -regex "PATTERN" 以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称
注意,在这个命令选项里,匹配的模式。也就是说你想匹配的字符串一定是文件的路径,支持正则表达
看一下示例蓝色框里的就是错误的,错误的地方在于字符串模式不是路径,所以没有结果而横线的位置就是想要匹配的正则表达的字符串模式inode号
find -inum n 按inode号查找 find -samefile name 相同inode号的文件
回顾一下查看文件的inode号用到的命令是 ls -i ,stat也能查到,在刚才查看的硬链接数旁边就是哦,圈圈出来的就是
至于操作跟硬链接数的模式是一样的这里就不演示了所属主、所属组:
find -user USERNAME 查找属主为指定用户的文件 find -group GRPNAME 查找属组为指定组的文件 find -uid UserID 查找属主为指定的UID号的文件 find -gid GroupID 查找属组为指定的GID号的文件 find -nouser 查找没有属主的文件 find -nogroup 查找没有属组的文件
现在我们还是进入到/app下,创建三个文件,并且分别把这三个文件的所属主和所属组改一下,并且分别删除一个所属主和所属组,先来看一下显示的结果
还是先回顾一下之前学过的,修改所属主和所属组的时候要确保主和组都存在,不然就要提前先创建,用到了useradd和groupadd;删除用到了userdel和groupdel,userdel -r 则表示删除这个用户所有信息,可一看到,文件的所属主和所属组被删除之后,所对应的位置变成了数字,好了,现在我们敲一下命令看一下显示的结果可以看到,当你同时搜索所属组和所属主的时候,如绿框所示,表示并且的关系,也就是说这个文件的所属主是liubei,所属组还需要是maidou才符合搜索的条件,好的,继续查找所属主和所属主的命令就是这样了,至于那俩个搜索UID和GID的命令选项,就是在选项uid或者gid后面加上你所要搜索的指定的uid数或者gid数就可以了,就不演示了文件类型
find -type TYPE: f: 普通文件 d: 目录文件 l: 符号链接文件 s:套接字文件 b: 块设备文件 c: 字符设备文件 p: 管道文件
好,看到这可能问题来了,就是文件类型从哪里看呢,那就用到了 ll 这个命令啦,看一下
可以看到首先我创建了一个目录文件,那么长形框里就是文件类型啦用法就是这样的啦条件组合
组合条件 与: -a 或: -o 非: -not, ! 德·摩根定律: (非 A) 或 (非 B) = 非(A 且 B) (非 A) 且 (非 B) = 非(A 或 B)
这个组合条件前面就已经学过了,所以就当做复习一下可以了,摩根定律个人记忆方法就是括号外和括号里所表达的意思相反,也就是非或就是且,非且就是或,这个的示例我们跟下面会讲到的权限条件合在一起说
根据文件大小来查找
find -size [+|-] # UNIT(单位) 常用单位: k, M, G, c(byte) # UNIT: (#-1, #] 如: 6k 表示(5k,6k] -# UNIT: [0,#-1] 如: -6k 表示[0,5k] +# UNIT: (#,∞) 如: +6k 表示(6k,∞)
这个选项包括下面要说到的时间里的参数的模式个人认为只能死记硬背了,如果你有更好的方法当然最好了,这个示例就不做了,还要创建指定大小的文件,后面有练习具体看一下就可以了,不难理解只是需要记忆
时间戳
以“天”为单位; find -atime [+|-]#, #: [#,#+1) +#: [#+1,∞] -#: [0,#) find -mtime find -ctime 以“分钟”为单位: find -amin find -mmin find -cmin
这里回顾一个知识点,atime:access time 文件被访问改变
mtime:modify time 文件被修改改变 ctime:change time atime或者mtime改变,ctime就改变权限查找
find -perm [/|-]MODE MODE: 精确权限匹配 /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系, +MODE 只适用于CentOS7之前的系统 -MODE: 每一类对象都必须同时拥有指定权限,与关系 0 表示不关注
现在我们把组合条件和权限合到一起看一下,首先我还是进入到/app下,当然里面的内容已经被我都删除了,创建几个文件,然后改一下每个文件的权限,随便改,看一下每个文件的权限
然后我们来根据权限查找文件对照着上面的权限,可以看出,直接敲222,就是精确的匹配权限就是222的文件;前面加/的,则是表示匹配任意一类的用户有2也就是写权限的文件就可以,也就是或者的意思;前面加-的,就是表示匹配所有人的都有2也就是写权限的文件,也就是并且的意思,并且加/和-的匹配是没有限制的权限不关注就可以了再看这个则是跟摩根定律一样的思路了,不是所有人都要有写的权限,那么就是任意一类用户没有写权限就可以了,同理,不是任意一类用户有写权限,也就是所有人都没有写权限处理动作
-print 默认的处理动作,显示至屏幕 -ls 类似于对查找到的文件执行“ls -l”命令 -delete 删除查找到的文件 -fls file 查找到的所有文件的长格式信息保存至指定文件中 -ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认(也就是会执行之前询问) -exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令(不询问)
{} 用于引用查找到的文件名称自身
find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令看一下长形框里是找到符合条件的文件,随着绿色箭头传递给了蓝色横线所标记的cp复制的这个命令,而中括号里所引用的就是长形框里查找的文件,而这个条命令表达的意思就是备份以.conf为结尾的文件并且后面加个.orig的后缀,所以显示的结果如粉色圈圈中的一样这条命令要表达的就是删除/tmp下存在4天或者超过四天的所属人是joe的文件之前询问一下,问啥询问你知道不,因为粉色圈里的 -ok 啊,执行之前要询问前面我也不记得说没说过了索性就再说一遍,如果你查找的不是当前目录下的文件,那么一定要在find 后面加上你要寻找的文件所在目录的目录名,也就是跟紫色双线一样,这条命令就是说长列出家目录下的目录文件既然说到了find 这个命令,那我们就顺便说一下xargs这个命令,原因是啥呢,因为find 不支持管道 | 来传递参数,你看完下面你就知道了他俩的关系了
练习1.查找/etc目录下大于1M且类型为普通文件的所有文件
2.查找/var目录下不属于root、 lp、 gdm的所有文件查找的文件太多了截不下,凑合看吧,注意蓝色横线标记的,不是或者就是并且3.查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
修改过,所以是-mtime,一周以内就是小于7天,所以是 -74.查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
都有执行权限,就是-111;其他用户有写权限,是-002,因为0表示不关注;相加就是最终查找条件转载于:https://blog.51cto.com/13572810/2065800