Find
僅在執行特定目錄的目錄中查找不包含文件的目錄
我有一個大型項目,我正在嘗試查找不包含
*_out.csv
文件的目錄。我看過其他類似的答案,我想我快到了。我遇到的問題是我只想查看正在進行的目錄,
analysis/
但我也不想查看一些也進行分析的特定目錄。我設置了一個小範例問題:
$ tree . ├── case1 │ ├── analysis │ │ ├── test1 │ │ │ ├── gold │ │ │ └── test1_out.csv │ │ └── test2 │ └── doc └── case2 ├── analysis │ ├── test3 │ │ └── gold │ └── test4 │ └── test4_out.csv └── doc 12 directories, 2 files
我不想查看標題為
*/doc/*
或的目錄*/gold/*
。我目前的命令是:find . -type d -not -name "doc" -not -name "gold" '!' -exec test -e "{}/*_out.csv" ';' -print
結果是:
. ./case1 ./case1/analysis ./case1/analysis/test1 ./case1/analysis/test2 ./case2 ./case2/analysis ./case2/analysis/test3 ./case2/analysis/test4
我理想的輸出看起來像
./case1/analysis/test2 ./case2/analysis/test3
如您所見,我目前
find
的命令排除了doc
andgold
目錄,但不排除有*_out.csv
文件的目錄,也不排除不繼續的目錄analysis/
。
因此,您要查看表單的目錄
*/analysis
,不包括某些子目錄。與其搜尋下的所有內容
.
,不如僅搜尋下*/analysis
。要排除子目錄,請使用
-prune
. 這是一個告訴 find 不要遞歸遍歷該子目錄的操作。最後,要測試是否存在與模式匹配的文件,您需要呼叫 shell。您
test
直接從呼叫find
,但test
不進行模式匹配,因此它僅測試名稱包含文字*
字元的文件的存在。呼叫sh
,將目錄名稱作為參數傳遞給它:-exec sh -c '…' {} \;
. 在 sh 程式碼中,展開一個萬用字元生成匹配文件列表,並檢查是否存在至少一個文件。find ./*/analysis -name "doc" -prune -o -name "gold" -prune -o \ -type d \! -exec sh -c 'set -- "$0"/*_out.csv; test -e "$1"' {} ';' -print
(我假設沒有名稱以 . 結尾的懸空符號連結
_out.csv
。)