在寫批量製做docker鏡像腳本時,先是將代碼目錄拷貝到對應的製做鏡像的目錄中,而後遍歷鏡像目錄執行build,製做鏡像,鏡像build完成以後,再將代碼目錄刪除,刪除代碼目錄時用到find -exec組合命令,可是卻報了:linux
No such file or directory
zzfdeMacBook-Air:temp zzf$ mkdir testaaa zzfdeMacBook-Air:temp zzf$ ls | grep testaaa testaaa zzfdeMacBook-Air:temp zzf$ find . -type d -name "testaaa" -exec rm -r {} \; find: ./testaaa: No such file or directory
再次查找testaaa目錄,發現testaaa目錄確實被刪除了。但爲何會報: No such file or directory呢?docker
zzfdeMacBook-Air:temp zzf$ ls testaaa ls: testaaa: No such file or directory
查閱了find的資料後發現,find 默認是遞歸查找,在執行上面的刪除目錄的組合命令時, 它會遍歷testaaa目錄, 實際執行過程以下:bash
-maxdepth levels:指定tests和actions做用的最大目錄深度,只能爲非負整數。能夠簡單理解爲目錄搜索深度,但並不是如此。當前path目錄的層次爲1,因此若指定-maxdepth 0將得不到任何結果。ui
zzfdeMacBook-Air:temp zzf$ ls -d testaaa testaaa zzfdeMacBook-Air:temp zzf$ zzfdeMacBook-Air:temp zzf$ find . -maxdepth 1 -type d -name "testaaa" -exec rm -r {} \; zzfdeMacBook-Air:temp zzf$ echo $? 0 zzfdeMacBook-Air:temp zzf$ ls -d testaaa ls: testaaa: No such file or directory
-prune: 不進入目錄(告訴find,不要在要刪除的目錄中查找子目錄或文件),因此可用於忽略目錄,但不會忽略普通文件。沒有給定-depth時,老是返回true,若是給定-depth,則直接返回false,因此-delete(隱含了-depth)是不能和-prune一塊兒使用的code
zzfdeMacBook-Air:temp zzf$ ls -d testaaa testaaa zzfdeMacBook-Air:temp zzf$ find . -type d -name "testaaa" -prune -exec rm -r {} \; zzfdeMacBook-Air:temp zzf$ echo $? 0 zzfdeMacBook-Air:temp zzf$ ls -d testaaa ls: testaaa: No such file or directory
+ 和 ; 區別:遞歸
; 是find遍歷一次執行一次exec後面的command, 而 + 會拆分批量找到的文件或目錄,批次運行命令,因此不會返回錯誤,並且當查找內容過多時, + 會下降CPU使用率。io
zzfdeMacBook-Air:temp zzf$ ls -d testaaa testaaa zzfdeMacBook-Air:temp zzf$ find . -type d -name "testaaa" -exec rm -r {} + zzfdeMacBook-Air:temp zzf$ echo $? 0 zzfdeMacBook-Air:temp zzf$ ls -d testaaa ls: testaaa: No such file or directory
固然也可使用 | (管道) + xargs 的方式:class
find . -type d -name "testaaa" | xargs rm -r
可是當testaaa並不存在時,執行這個組合命令,會返回一個非0的狀態碼,並不符合個人場景。test