特定のディレクトリ内でファイルを含まないディレクトリのみを探す

特定のディレクトリ内でファイルを含まないディレクトリのみを探す

私は大きなプロジェクトを持っていて、ファイルを含まないディレクトリを見つけようとしています*_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しないディレクトリも除外しません。docgold*_out.csvanalysis/

ベストアンサー1

したがって、特定のサブディレクトリを除いてフォームのディレクトリを表示しようとします*/analysis

以下の内容をすべて検索するのではなく、.以下の内容のみを検索してください*/analysis

サブディレクトリを除外するには、を使用します-prune。これは、 find がサブディレクトリを繰り返し探索しないように指示するアクションです。

最後に、パターンに一致するファイルが存在するかどうかをテストするには、シェルを呼び出す必要があります。testから直接呼び出すがfindパターンtestマッチがないので、*名前にリテラル文字を含むファイルがあるかどうかをテストします。呼び出してshディレクトリ名を引数として渡します-exec sh -c '…' {} \;。 shコードでワイルドカード文字を展開して一致するファイルのリストを作成し、既存のファイルが1つ以上あることを確認します。

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。)

おすすめ記事