• find查找时排除目录及文件


    查找根目录下大于500M的文件,排除/proc目录

    find / ! -path "/proc/*" -type f -size +500M | sort -rh|xargs ls -lh | awk '{ print $9 ": " $5 }'

    如果排除俩个目录

    find / ! -path "/proc/*" ! -path "/home/*" -type f -size +500M | sort -rh|xargs ls -lh | awk '{ print $9 ": " $5 }'

    参考

    find排除目录 - raindream - 博客园
    https://www.cnblogs.com/drizzlewithwind/p/5705915.html

    find命令:忽略一个目录或者多个目录 - PhoenixMY - 博客园
    https://www.cnblogs.com/PhoenixMY/p/5919810.html

    1)find过滤目录
    使用find命令在linux系统中查找文件时,有时需要忽略某些目录,可以使用"-path 过滤的目录路径 -prune -o"参数来进行过滤。不过必须注意:要忽略的路径参数要紧跟着搜索的路径之后,否则该参数无法起作用

    拿一个例子来说明下:
    比如查找/data/web/ssy/online路径下的的目录,并统计目录大小,以G位单位进行排序(默认为降序),并统计前10个大小的目录。命令如下:
    # find /data/web/ssy/online/* -maxdepth 0 -type d -exec /usr/bin/du -sh {} ;|grep '[0-9]G'|sort -rh|head -10
     
    查找/data/web/ssy/online路径下除tmp目录之外的目录,并统计目录大小,以G位单位进行排序(默认为降序),并统计前10个大小的目录。命令如下
    # find /data/web/ssy/online/* -path /data/web/ssy/online/tmp -prune -o -maxdepth 0 -type d -exec /usr/bin/du -sh {} ;|grep '[0-9]G'|sort -rh|head -10
     
    注意:
    1)"-maxdepth 0" 表示只查找到/data/web/ssy/online下的目录。如果是"-maxdepth 1"则表示查找到/data/web/ssy/online/xxx下的目录
    2)find命令中的过滤、忽略、排除使用"-path 过滤的文件或目录-prune -o ",其中-prune类似于if判断,如果-prune之前的语句为真,比如找到了
       前面-path指定的/data/web/ssy/online/tmp目录,就不再执行后面-o跟的语句了,如果没有找到则执行后面的语句。这样就做到了排除效果!
       其中的"-o" 是 "-or" 的意思!
    3)-path要过滤掉的文件或目录路径参数一定要紧跟在要搜索的路径之后,否则过滤效果就不会实现!!也就是说上面的"-path /data/web/ssy/online/tmp"
       必须紧跟着放在"/data/web/ssy/online/*"后面,否则查找时就不会过来掉/data/web/ssy/online/tmp这个目录。
     
    ========================================================================================================================================================
    示例一:
    假设/opt/kevin目录下有三个目录:test1,test2,test3,三个目录下都有list文件
    [root@localhost kevin]# pwd
    /opt/kevin
    [root@localhost kevin]# ls
    test1  test2  test3
     
    现在要查找/opt/kevin路径下的list文件,并忽略掉test2目录,操作如下:
    [root@localhost kevin]# pwd
    /opt/kevin
    [root@localhost kevin]# find . -type f -name list
    ./test1/list
    ./test2/list
    ./test3/list
    [root@localhost kevin]# find . -type f -name list -print
    ./test1/list
    ./test2/list
    ./test3/list
     
    使用-path 和 -prune -o实现过滤效果
    [root@localhost kevin]# find . -path test2 -prune -o -type f -name list -print  
    ./test1/list
    ./test2/list
    ./test3/list
     
    [root@localhost kevin]# find . -path ./test2/ -prune -o -type f -name list -print
    find: warning: -path ./test2/ will not match anything because it ends with /.
    ./test1/list
    ./test2/list
    ./test3/list
     
    当搜索路径不是全路径时,过滤目录路径必须是./test2 才能实现过滤效果!
    [root@localhost kevin]# find . -path ./test2 -prune -o -type f -name list -print
    ./test1/list
    ./test3/list
     
     
    要过滤的目录操作-path必须紧跟着搜索路径 才能实现过滤效果
    [root@localhost kevin]# find . -type f -path ./test2 -prune -o -name list -print
    ./test1/list
    ./test2/list
    ./test3/list
     
    当搜索路径时全路径时,过滤路径也要是全路径,才能实现过滤效果
    [root@localhost kevin]# find . -path /opt/kevin/test2 -prune -o -type f -name list -print  
    ./test1/list
    ./test2/list
    ./test3/list
     
    [root@localhost kevin]# find /opt/kevin/ -path /opt/kevin/test2 -prune -o -type f -name list -print
    /opt/kevin/test1/list
    /opt/kevin/test3/list
     
    [root@localhost kevin]# find /opt/kevin/* -path /opt/kevin/test2 -prune -o -type f -name list -print
    /opt/kevin/test1/list
    /opt/kevin/test3/list
     
    [root@localhost kevin]# find /opt/kevin -path /opt/kevin/test2 -prune -o -type f -name list -print 
    /opt/kevin/test1/list
    /opt/kevin/test3/list
     
    [root@localhost kevin]# find /opt/kevin -path /opt/kevin/test2/ -prune -o -type f -name list -print
    find: warning: -path /opt/kevin/test2/ will not match anything because it ends with /.
    /opt/kevin/test1/list
    /opt/kevin/test2/list
    /opt/kevin/test3/list
     
    由上面可知:
    1)当要搜索的目录不是全路径时,要过滤掉的目录必须是"./test2"才能实现过滤效果。如果是"test2"或者"./test2/"都不能实现过滤效果。
    2)当要搜索的目录是全路径时,要过滤掉的目录也必须是全路径才能实现过滤效果!要过滤掉的目录后面不能加"/",否则也不能实现过滤效果。
    3)过滤操作"-path /opt/kevin/test2/ -prune -o"必须紧跟在要搜索路径的后面才能实现过滤效果,否则也不能实现过滤效果。
     
    如果要过滤两个目录,比如过滤掉test2和test3目录,则使用转义符( -path ./test2 -o -path ./test3 -prune -o )
    注意:两个转义符前面都要有空格!!
     
    [root@localhost kevin]# find . -path ./test2 -o -path ./test3 -prune -o -type f -name list -print
    ./test1/list
    ./test2/list
     
    [root@localhost kevin]# find . ( -path ./test2 -o -path ./test3 ) -prune -o -type f -name list -print
    ./test1/list
     
    [root@localhost kevin]# find /opt/kevin/ ( -path /opt/kevin/test2 -o -path /opt/kevin/test3 ) -prune -o -type f -name list -print  
    /opt/kevin/test1/list
     
    除了上面的方法,还有一个方法如下:
    [root@localhost kevin]# find . -type f -name list ! -path ./test2/* ! -path ./test3/*     
    ./test1/list

    2)find过滤文件
    先查看对应文件,然后使用"grep -v"进行过滤

    比如只查找/opt/kevin目录下的文件(不查找/opt/kevin的二级目录下的文件),并过滤到haha2文件
    [root@localhost kevin]# pwd
    /opt/kevin
    [root@localhost kevin]# ll
    total 0
    -rw-r--r-- 1 root root  0 Nov 21 18:51 haha
    -rw-r--r-- 1 root root  0 Nov 21 18:51 haha1
    -rw-r--r-- 1 root root  0 Nov 21 18:51 haha2
    -rw-r--r-- 1 root root  0 Nov 21 18:51 haha3
    -rw-r--r-- 1 root root  0 Nov 21 18:51 haha4
    drwxr-xr-x 2 root root 18 Nov 21 18:24 test1
    drwxr-xr-x 2 root root 18 Nov 21 18:24 test2
    drwxr-xr-x 2 root root 18 Nov 21 18:24 test3
     
    [root@localhost kevin]# find . -maxdepth 1 -type f
    ./haha
    ./haha1
    ./haha2
    ./haha3
    ./haha4
     
    [root@localhost kevin]# find . -maxdepth 1 -type f |grep -v "haha2"
    ./haha
    ./haha1
    ./haha3
    ./haha4
     
    过滤多个文件,就使用多个"grep -v"
    [root@localhost kevin]# find . -maxdepth 1 -type f |grep -v "haha2"
    ./haha
    ./haha1
    ./haha3
    ./haha4
     
    [root@localhost kevin]# find . -maxdepth 1 -type f |grep -v "haha2"|grep -v haha3
    ./haha
    ./haha1
    ./haha4
     
    [root@localhost kevin]# find . -maxdepth 1 -type f |grep -v "haha2"|grep -v haha3|grep -v haha4
    ./haha
    ./haha1
    
    3)find命令中的-maxdepth和-mindepth:控制搜索深度的选项
    -maxdepth :指定遍历搜索的最大深度。最大目录层级
    -mindepth: 指定开始遍历搜索的最小深度。最小目录层级
    
        
    -maxdepth 0:最大目录层级为0,表示只针对当前目录本身(比如/opt/kevin)进行搜索操作或du -sh 统计操作。
    -maxdepth 1:最大目录层级为1,表示针对/opt/kevin/ 路径进行搜索操作或du -sh 统计操作。
    -maxdepth 2:最大目录层级为2,表示针对/opt/kevin/xxx/ 路径进行搜索操作或du -sh 统计操作。
       
    [root@localhost kevin]# pwd
    /opt/kevin
    [root@localhost kevin]# ll
    total 0
    -rw-r--r-- 1 root root  0 Nov 21 18:51 haha
    -rw-r--r-- 1 root root  0 Nov 21 18:51 haha1
    -rw-r--r-- 1 root root  0 Nov 21 18:51 haha2
    -rw-r--r-- 1 root root  0 Nov 21 18:51 haha3
    -rw-r--r-- 1 root root  0 Nov 21 18:51 haha4
    drwxr-xr-x 2 root root 18 Nov 21 18:24 test1
    drwxr-xr-x 2 root root 18 Nov 21 18:24 test2
    drwxr-xr-x 2 root root 18 Nov 21 18:24 test3
       
    -maxdepth 0 表示最小目录层级是0,即搜索路径它本身
    [root@localhost kevin]# find . -maxdepth 0 -type f
      
    但是如果当前路径加入"*"使用"-maxdepth 0" 效果和 当前路径不加"*"使用"-maxdepth 1" 是一样的!
    [root@localhost kevin]# find ./* -maxdepth 0 -type f
    ./haha
    ./haha1
    ./haha2
    ./haha3
    ./haha4
       
    [root@localhost kevin]# find . -maxdepth 1 -type f
    ./haha
    ./haha1
    ./haha2
    ./haha3
    ./haha4
       
    [root@localhost kevin]# find /opt/kevin -maxdepth 0 -type f 
    [root@localhost kevin]# find /opt/kevin/ -maxdepth 0 -type f
    [root@localhost kevin]# find /opt/kevin/* -maxdepth 0 -type f
    /opt/kevin/haha
    /opt/kevin/haha1
    /opt/kevin/haha2
    /opt/kevin/haha3
      
    [root@localhost kevin]# find /opt/kevin -maxdepth 1 -type f
    /opt/kevin/haha
    /opt/kevin/haha1
    /opt/kevin/haha2
    /opt/kevin/haha3
    /opt/kevin/haha4
    [root@localhost kevin]# find /opt/kevin/ -maxdepth 1 -type f
    /opt/kevin/haha
    /opt/kevin/haha1
    /opt/kevin/haha2
    /opt/kevin/haha3
    /opt/kevin/haha4
      
    [root@localhost kevin]# find /opt/kevin/* -maxdepth 1 -type f
    /opt/kevin/haha
    /opt/kevin/haha1
    /opt/kevin/haha2
    /opt/kevin/haha3
    /opt/kevin/haha4
    /opt/kevin/test1/list
    /opt/kevin/test2/list
    /opt/kevin/test3/list
      
    [root@localhost kevin]# find . -maxdepth 2 -type f
    ./test1/list
    ./test2/list
    ./test3/list
    ./haha
    ./haha1
    ./haha2
    ./haha3
    ./haha4
      
    结论:
    如果搜索路径后面加了"*",则使用"-maxdepth n"
    和
    不加"*"使用"-maxdepth n+1"
    的效果是一样的!!
       
    超过了实际目录级层,效果是一样的
    [root@localhost kevin]# find . -maxdepth 3 -type f
    ./test1/list
    ./test2/list
    ./test3/list
    ./haha
    ./haha1
    ./haha2
    ./haha3
    ./haha4
       
    [root@localhost kevin]# find . -maxdepth 4 -type f
    ./test1/list
    ./test2/list
    ./test3/list
    ./haha
    ./haha1
    ./haha2
    ./haha3
    ./haha4
       
    如果仅仅只是在/opt/kevin/xxx下搜索,即这里的最小目录深度是2
    [root@localhost kevin]# pwd
    /opt/kevin
    [root@localhost kevin]# ll
    total 0
    -rw-r--r-- 1 root root  0 Nov 21 18:51 haha
    -rw-r--r-- 1 root root  0 Nov 21 18:51 haha1
    -rw-r--r-- 1 root root  0 Nov 21 18:51 haha2
    -rw-r--r-- 1 root root  0 Nov 21 18:51 haha3
    -rw-r--r-- 1 root root  0 Nov 21 18:51 haha4
    drwxr-xr-x 2 root root 18 Nov 21 18:24 test1
    drwxr-xr-x 2 root root 18 Nov 21 18:24 test2
    drwxr-xr-x 2 root root 18 Nov 21 18:24 test3
       
    [root@localhost kevin]# find . -mindepth 2 -type f
    ./test1/list
    ./test2/list
    ./test3/list
       
    最小目录层级为0
    [root@localhost kevin]# find . -mindepth 0 -type f
    ./test1/list
    ./test2/list
    ./test3/list
    ./haha
    ./haha1
    ./haha2
    ./haha3
    ./haha4
       
    最小目录层级为1
    [root@localhost kevin]# find . -mindepth 1 -type f
    ./test1/list
    ./test2/list
    ./test3/list
    ./haha
    ./haha1
    ./haha2
    ./haha3
    ./haha4
       
    最小目录层级为3,即超过当前最大目录层级,则就搜索不到了!
    [root@localhost kevin]# find . -mindepth 3 -type f
     
    ========================================================================
    -mindepth和-maxdepth可以一起结合起来使用,用于搜索指定层级范围内的文件。
    ========================================================================
    如果只想搜索/opt/kevin/xxx下的文件,可行的做法:
    第一种做法:最大目录层级是1,即-maxdepth 1
    [root@localhost kevin]# find ./* -maxdepth 0 -type f
    ./haha
    ./haha1
    ./haha2
    ./haha3
    ./haha4
     
    [root@localhost kevin]# find . -maxdepth 1 -type f            
    ./haha
    ./haha1
    ./haha2
    ./haha3
    ./haha4
     
    第二种做法:最小目录层级是1,最大目录层级是1,即-mindepth 1 -maxdepth 1
    [root@localhost kevin]# find . -mindepth 1 -maxdepth 1 -type f 
    ./haha
    ./haha1
    ./haha2
    ./haha3
    ./haha4
     
    再来看下面的示例
    [root@localhost kevin]# echo "123456" > bo/bobo/list1
    [root@localhost kevin]# echo "123456" > bo/bobo/list2
    [root@localhost kevin]# echo "123456" > bo/bobo/ke/list3
    [root@localhost kevin]# echo "123456" > bo/bobo/ke/list4
    [root@localhost kevin]# ll bo/
    total 0
    drwxr-xr-x 3 root root 42 Nov 21 23:23 bobo
    [root@localhost kevin]# ll bo/bobo/
    total 8
    drwxr-xr-x 2 root root 32 Nov 21 23:23 ke
    -rw-r--r-- 1 root root  7 Nov 21 23:23 list1
    -rw-r--r-- 1 root root  7 Nov 21 23:23 list2
    [root@localhost kevin]# ll bo/bobo/ke/
    total 8
    -rw-r--r-- 1 root root 7 Nov 21 23:23 list3
    -rw-r--r-- 1 root root 7 Nov 21 23:23 list4
     
    如果想搜索/opt/kevin/xxx/xxx下的文件,即最小目录层级是3,最大目录层级是3
    [root@localhost kevin]# find . -mindepth 3 -type f           
    ./bo/bobo/ke/list3
    ./bo/bobo/ke/list4
    ./bo/bobo/list1
    ./bo/bobo/list2
     
    [root@localhost kevin]# find . -maxdepth 3 -type f           
    ./test1/list
    ./test2/list
    ./test3/list
    ./haha
    ./haha1
    ./haha2
    ./haha3
    ./haha4
    ./bo/bobo/list1
    ./bo/bobo/list2
     
    [root@localhost kevin]# find . -mindepth 3 -maxdepth 3 -type f
    ./bo/bobo/list1
    ./bo/bobo/list2
     
    如果想要搜索第二层级和第三层级之间的文件,如下:
    [root@localhost kevin]# find . -mindepth 2 -type f           
    ./test1/list
    ./test2/list
    ./test3/list
    ./bo/bobo/ke/list3
    ./bo/bobo/ke/list4
    ./bo/bobo/list1
    ./bo/bobo/list2
     
    [root@localhost kevin]# find . -maxdepth 3 -type f             
    ./test1/list
    ./test2/list
    ./test3/list
    ./haha
    ./haha1
    ./haha2
    ./haha3
    ./haha4
    ./bo/bobo/list1
    ./bo/bobo/list2
     
    [root@localhost kevin]# find . -mindepth 2 -maxdepth 3 -type f
    ./test1/list
    ./test2/list
    ./test3/list
    ./bo/bobo/list1
    ./bo/bobo/list2

    转自

    Find 查找命令时过滤掉某些文件或目录 以及 -maxdepth、-mindepth的用法 - 散尽浮华 - 博客园 https://www.cnblogs.com/kevingrace/p/11907695.html

  • 相关阅读:
    动手动脑感想
    原码反码补码
    java测试感想
    报告
    假期报告
    假期报告
    java学习进度
    《大道至简》读后感
    2020/1/31 PHP代码审计之目录穿越漏洞
    [极客大挑战 2019]BabySQL
  • 原文地址:https://www.cnblogs.com/paul8339/p/8370529.html
Copyright © 2020-2023  润新知