find命令过滤 no such_linux find -exec rm -r 报No such file or directory
linux find -exec rm -r 報: No such file or directory
系統環境Ubuntu 16.04.3 LTS
在寫批量制作docker鏡像腳本時,先是將代碼目錄拷貝到對應的制作鏡像的目錄中,然后遍歷鏡像目錄執行build,制作鏡像,鏡像build完成之后,再將代碼目錄刪除,刪除代碼目錄時用到find -exec組合命令,但是卻報了:
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呢?
zzfdeMacBook-Air:temp zzf$ ls testaaa
ls: testaaa: No such file or directory
查閱了find的資料后發現,find 默認是遞歸查找,在執行上面的刪除目錄的組合命令時, 它會遍歷testaaa目錄, 實際執行過程如下:
查詢當前目錄下的所有目錄
進行模式匹配"testaaa", 匹配成功? 成功。
執行exec后的命令: rm -r testaaa
find 嘗試進入到testaaa/目錄中,查找目錄或文件,并執行exec后面的命令
find 沒有找到testaaa目錄,返回ENOENT(No such file or directory)
解決方法有很多種,下面只列出常用方式:
1. 使用find的 -maxdepth OPTIONS:
-maxdepth levels:指定tests和actions作用的最大目錄深度,只能為非負整數。可以簡單理解為目錄搜索深度,但并非如此。當前path目錄的層次為1,所以若指定-maxdepth 0將得不到任何結果。
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
2. 使用find的 -prune ACTIONS:
-prune: 不進入目錄(告訴find,不要在要刪除的目錄中查找子目錄或文件),所以可用于忽略目錄,但不會忽略普通文件。沒有給定-depth時,總是返回true,如果給定-depth,則直接返回false,所以-delete(隱含了-depth)是不能和-prune一起使用的
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
3. 使用find的 -delete ACTIONS:
-delete,它隱含"-depth"選項
-depth: 搜索到目錄時,先處理目錄中的文件(子目錄),再處理目錄本身。對于"-delete"這個action,它隱含"-depth"選項
zzfdeMacBook-Air:temp zzf$ ls -d testaaa
testaaa
zzfdeMacBook-Air:temp zzf$ find . -type d -name "testaaa" -delete
zzfdeMacBook-Air:temp zzf$ echo $?
0
zzfdeMacBook-Air:temp zzf$ ls -d testaaa
ls: testaaa: No such file or directory
4. 使用 + (加號)作為find命令的終止符,而不使用 ; (分號)
+ 和 ; 區別:
; 是find遍歷一次執行一次exec后面的command, 而 + 會拆分批量找到的文件或目錄,批次運行命令,所以不會返回錯誤,而且當查找內容過多時, + 會降低CPU使用率。
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 的方式:
find . -type d -name "testaaa" | xargs rm -r
但是當testaaa并不存在時,執行這個組合命令,會返回一個非0的狀態碼,并不符合我的場景。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的find命令过滤 no such_linux find -exec rm -r 报No such file or directory的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 公路商店app如何发布动态(北京高速公路
- 下一篇: java类放到对象_Java中类和对象总