查找根目錄下大於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
