Find

僅在執行特定目錄的目錄中查找不包含文件的目錄

  • July 23, 2019

我有一個大型項目,我正在嘗試查找不包含*_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的命令排除了docandgold目錄,但不排除有*_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。)

引用自:https://unix.stackexchange.com/questions/531722