Loading... <p><span style="font-size: 20px"><strong> find</strong></span></p> <p> 字符串类查询: <br /> -type //根据文件类型查找 <br /> f:普通文件 <br /> d:目录 <br /> c:字符文件 <br /> b:块设备 <br /> s:套接字文件 <br /> p:命名管道</p> <p> <strong> -i:忽略大小写</strong><br /> -name , -iname //按文件名查找<br /> -path , -ipath //按路径名查找<br /> -regex , -iregex //使用正则表达式<br /> 例:</p> <pre class="brush:bash;toolbar:false"> # 要十分注意这类模糊查询,在脚本中一定要加引号,否则Gi*会被替换为所有以Gi开头的文件,导致find报错误,说没有指定查找路径。 find ${BINDIR} -name "Gi*" -exec md5sum {} \; # 找出文件名 或 路径中含有 script字样的所有文件 及 路径,并忽略大小写。 find . -ipath "*script*" # 查找当前目录下以.py 或.sh结尾的文件 find . -iregex ".*\(\.py\|\.sh\)$"</pre> <p> -inum //通过文件或目录的inode查找<br /> 例:</p> <p> linux有时会遇到一些很难操作的文件名,这时可用ls -i看它到inode,在用find找到这个inode对应的文件,在删除。</p> <pre class="brush:bash;toolbar:false"> find / -inum 1002910 -exec rm {} \; # {}:大括号是前面-inum参数找到的所有文件。</pre> <p> -prune : 修剪掉指定目录;即过滤指定目录。<br /> 例:搜索当前目录下除目录名为etc的目录外,其它目录的所有文件。</p> <pre class="brush:bash;toolbar:false"> find . \( -name "etc" -prune \) -o \( -type f -print \) # -maxdepth 指定查找的目录最大深度 # -mindepth 指定查找的目录最小深度。 find / -maxdepth 2 -type f find / -mindepth 3 -type f</pre> <p> </p> <p style="text-indent: 0em">数字类查找: </p> <pre class="brush:bash;toolbar:false"> -size # 与:-and , -a # 找大于3M 并且 小于4M的文件 find / -size +3000k -and -size -4000k # 或:-or , -o find / -size -3000k -or -size +4000k # 非:-not , ! --------------------------------------------------- 两个条件没有指定逻辑关系时,默认使用“与” -not A -a -not B 等价于 -not(A -o B) -not A -o -not B 等价于 -not(A -a B) -------------------------------------------------- 例: # 查找/etc目录下最近一周内其内容修改过,且属主不为root或hadoop的所有文件; find /etc/ ! \( -user root -a -user hadoop \) -mtime -7 -ls # 等价于 find /etc/ ! -user root -o ! -user hadoop -mtime -7 -ls # 查找/etc目录下所有用户都没有写权限的文件;【注:权限匹配请看下面关于如何计算权限匹配的说明】 find /etc ! \( -perm -222 -o -perm -220 -o -perm -200 -o -perm -022 -o -perm -002 -o -perm -020 -o -perm -202 \) -ls # 等价于 find /etc ! -perm -222 -a ! -perm -220 -a ! -perm -200 -a ! -perm -022 -a ! -perm -002 -a ! -perm -020 ! -perm -202 -ls 以天为单位: -atime -mtime -ctime 以分钟为单位: -amin -mmin -cmin 示例: # -5指定是 当前时间 - 5天之间 被访问的都找出来。 find / -atime -5 # +5指的是 5天前往更久远的所有时间,只要文件内容被修改都会被找到。 find / -mtime +5 # 表示从当前时间向后数5个24小时,5就是第5个24小时的整点处,属性信息被改变过的所有文件。 find / -ctime 5</pre> <pre class="brush:bash;toolbar:false">----------------------------------|5|---------------------------------|当前时间| |---------->[ +5:5天前 ]<---------| |------------>[ -5 :5天内] <------| # 注:find计算5天的方式是:从当前时间开始向前延伸24小时为一天,5天就是5个24小时, 若指定为 5 ,则表示从当前时间向后数5个24小时,5就是第5个24小时的整点处。</pre> <p> </p> <p> 要验证可用下面脚本测试:</p> <pre class="brush:bash;toolbar:false">cat find.sh #!/bin/bash date 100118002014.02 # 修改时间为10月1号18:00:02 touch a.txt # 创建文件 echo "File Create Complete!!" date 100418002014.00 # 修改时间为10月4号18:00:00 echo "Now : October 4 ; Script Complete!!" find /root -mtime -3 | grep "a.txt" # 1号18:00:02 到 4号18:00:00 之间跨度为:3天差2秒 # 设置找mtime为 3天内修改的文件,3天 包含 2天23个小时58秒 # 故 可测出find 按时间找的时候就是按 24小时为一天算的。</pre> <p> 权限类查找: <br /> 用户和组查找<br /> -uid 按用户的UID来查找文件或目录<br /> -user 和 -group 按指定用户或组来查找文件或目录<br /> -nouser 和 -nogroup 它们可以找出系统中所有文件的owner丢失的文件,owner丢失可能是文件所有者被删除或是通过NIS这种网络用户登陆后,创建的文件。<br /> 示例:</p> <pre class="brush:bash;toolbar:false"> # 找出test创建的所有文件 find / -user test find / -group mysql # 监控系统中owner丢失的文件【{}:大括号是前面-nouser参数找到的所有文件。】: find / -nouser -exec chown root:root {} \;</pre> <p> 权限查找 <br /> find / -perm 777 <br /> 示例:<br /> 监控文件系统中other栏位存在write权限的文件和目录。</p> <pre class="brush:bash;toolbar:false"> find / -type f -perm -2 -->它可找出系统中所有other权限中包含write的文件。 【注意:权限 + 是做 or 运算, - 是做 and 运算。 -perm -2: 指的是other栏中包含write权限的意思, -22: 就是Group和Other两栏中都有write权限的意思。 -222: 就是全部包含write权限的意思。 】</pre> <pre class="brush:bash;toolbar:false"> find /etc/ ! -perm -111 -ls //查找/etc目录下至少有一类用户没有执行权限的文件 --------------------------------------- 合并后的权限 sst rwx rwx rwx 0000----------000 000 000 000 0001----------000 000 000 001 0011----------000 000 001 001 0100----------000 001 000 000 0110----------000 001 001 000 0010----------000 000 001 000 0101----------000 001 000 001 and(-) 0111----------000 001 001 001 - - - 结果 ? ? ? -----------------------------------------</pre> <p> 结果:每中权限组合与0111做与运算时,都为False.因此通过排除这个权限,就可以得到非0111权限的所有文件。<br /> <br /> 对SUID和SGID的监控:<br /> 【要关闭FileSystem上的SUID和SGID就在挂载FS时,加上nosuid这个参数即可。】<br /> # 文件的权限为具有SUID和SGID的。通过这个命令可从系统中找出所有SUID和SGID的文件,可用来进行对<br /> SUID和SGID文件的监控。</p> <p> find / -type f -perm +6000</p> <p> —————————————<br /> 合并后的权限 sst rwx rwx rwx<br /> 2000———-010 000 000 000<br /> 4000———-100 000 000 000<br /> 6000———-110 000 000 000<br /> 6660———-110 110 110 000 //我们关注的SUID和SGID因此其他尾其实可以忽略</p> <p> or(+)<br /> 6000———-110 000 000 000<br /> – –<br /> 结果 11<br /> ———————————– <br /> 结果:6000通过与所有可能的权限做或运算,我们可知它每种情况都为True。<br /> 注意:因为我们只想找SUID和SGID被设置的文件,其他权限是什么我不关心.<br /> <br /> <br /> -ls:类似于ls -l显示详细信息<br /> -exec COMMAND {} \;<br /> 例:<br /> 测试方法:</p> <pre class="brush:bash;toolbar:false"> useradd abc su - abc cd /tmp mkdir abc cd abc touch abc.txt abc.conf abc.pdf su - root userdel abc find /tmp -nouser -nogroup -fprintf /root/waining.txt '%AD %AT %-10s %n %p %u %#m\n' -exec chown root.root {} \; # 或: -exec mv {} /root/waindir/ \; # 注: %AD :输入到文件的日期格式 %AT:输入到文件的时间格式 # %-10s : 文件大小 # %n : 硬连接 # %p : 权限 %#m :权限细节 %u :用户UID</pre> <p> <br /> 注:一次性查找符合条件的所有文件,并一同传递给-exec或-ok后面指定的命令;<br /> 但有些命令不能接受过长的参数;此时使用另一种方式: find … | xargs COMMAND <br /> ————————————————-<br /> 关于xargs的一些用法提示:</p> <pre class="brush:bash;toolbar:false"> echo a b c | xargs -n 1 echo # xargs每次接受1个值,并将值传给 echo输出。 echo a b c | xargs -n 2 echo # xargs每次接受2个值,并将值传给 echo输出。 echo a b c | xargs echo # 一次接受所有的值,并将值传给 echo输出。 cut -d ':' -f 1 /etc/passwd | xargs -i -e'mail' -p -n2 echo cut -d ':' -f 1 /etc/passwd | xargs -i[ -e'mail' -p -n2 echo [ # -i 后面可指定 代替符 ,如:[, {}, 等 # -e'mail' :指定已mail为结束标志,注意-e后面的参数不能有空格 ; # -p:询问 # -n2:指定一次传几个参数给 后面的命令。</pre> <p> <br /> <br /> <br /> </p> <p> </p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信