2013-04-25 6 views
5

私は、いくつかのファイルを持つ多数のサブディレクトリを含むディレクトリを持っているとします。これらのディレクトリの中に特定のファイルが含まれていないかどうかチェックしたいと思います。例えば、これらは私のディレクトリであれば:私はfooを含まないすべてのディレクトリを一覧表示したい場合はfind内の特定のファイル名を含まないディレクトリを除外しますか?

dir/A: 
    foo 
    bar 
dir/B: 
    bar 
dir/C: 
    foo 
dir/D: 
dir/E: 
    foo 
    bar 

、私はなるだろう:

dir/B 
dir/D 

は、それは、UNIX findでこれを行う、または行うことが可能です代替ツールを使用する必要がありますか?

答えて

7

私はAの後に良い解決策を見つけましたより多くの研究:

find . -type d \! -exec test -e '{}/foo' \; -print

fooは、お探しのファイルで置き換えてください。

これは、探しているファイルが含まれていないすべてのディレクトリのリストを表示します。

+0

出力に存在する現在のフォルダ './'を削除する方法はありますか?これらのサブディレクトリを別のディレクトリにコピーする必要がある場合、 '。/'の存在は有害です – WanderingMind

0
comm -3 <(find -type d) <(find -name foo -printf '%h\n') 
  • は、すべてのディレクトリが
  • foo
  • は比較含んディレクトリのみ、印刷の唯一の違い
0

1をゲット - 現在のディレクトリに単純に1つのライナースクリプトを作成します(またはあなたのパスのどこかに)。さんはcheck.shという名前を付けてみましょう:

cd "$1" && [[ ! -f "$2" ]] && pwd 

2 - 上記のスクリプトに実行権限を付与します。

chmod +x ./check.sh 

3 - 最後に、この発見のコマンドを使用します。

find . -maxdepth 1 -type d -exec ./check.sh '{}' foo \; 
0

少し遅れて相手に、ここでは動作するはずワンライナーです:

ls | xargs -I dir ls dir/foo > /dev/null 

トリックはls */fooは黙って「foo」を含まない非マッチングディレクトリ(ディレクトリ上を通過するということです)ので、xargsを使用すると、fooが含まれていないディレクトリのstderrに出力されます。それから、ちょうど私たちが探しているものを見るためにstdoutを投げることの問題です。

関連する問題