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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM