私は大きなプロジェクトを持っていて、ファイルを含まないディレクトリを見つけようとしています*_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
gold
*_out.csv
analysis/
ベストアンサー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
。)