同じ名前のすべてのディレクトリ内のサブディレクトリを見つける


8

次のコマンドを実行したい:

  1. inc」フォルダの下の「」という名前のすべてのディレクトリを検索しますX
  2. 各「X/.../inc/」の下にすべてのサブディレクトリをリストします。
  3. " list" という名前のファイルに出力をリダイレクトします

以下のコマンドのさまざまな組み合わせを試しましたが、成功しませんでした。

$ find X/ -name "inc" -print | xargs find {} -type d > list
find: path must precede expression

これどうやってするの?

回答:


13

find 単独でこれを行うことができます:

find X -path '*/inc/*' -type d > list

詳細については、の-path部分をお読みman findください。

コメントですぐに述べたように、ディレクトリ行をテキストファイルに分けて保存すると、改行を含むディレクトリ名は明確に表現できなくなります。ディレクトリに改行が含まれていないことが確実な場合は、それで問題ありません。ただの一般的な発言。



または、X -name 'inc' -type d> list
MaQleod

@MaQleod:いいえ、それは問題ではありません。
Daniel Andersson、

4

ここに便利なワンライナーがあります:

find X -type d -name "inc" -exec sh -c 'find {} -type d' \; > list

find最初のfind結果ごとに実行されます。このexecオプションは、最小限のシェルコマンドを使用することもできます。このコマンドで{}は、前述のとおり、最初のの各ディレクトリに置き換えられfindます。

2番目findは、リクエストに応じて、ディレクトリを含む最初の結果の「すべてのサブディレクトリを一覧表示」しますinc。それ自体を出力に含めたくない場合は、2番目find に少なくとも深さ1のフォルダーを出力させます。

find X -type d -name "inc" -exec sh -c 'find {} -mindepth 1 -type d' \; > list

次に、コマンドをにリダイレクトstdoutlistます。


私だけのオリジナルマッチの深さ1つのサブディレクトリを望んでいたところ、その答えのバリエーションは私には役立ちました find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
コアを

1

さて、このネストされた検索をシミュレートする答えを見つけました:

find X/ -type d | grep "/inc/" > list

それもうまくいきます!しかし、Unix / Linuxシェルでは、答えのようなものは実際にはありません。それは個人的な好みと従うのが簡単なものの混合です。
Vishal Kotcherlakota 2012年

改行などで従来とは異なる(ただし既存の)ファイル名を処理するには:find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > listgrep -znull文字で区切られますが、その出力もnullで区切られているように見えるため、パイプxargs -0L1 echoラインで行ごとに取得する必要があります。 )。この場合、あなたは改行で区切られたすべてのエントリをファイルにリストを保存しているため、ファイル名に改行がしますまだ曖昧表現されます。おそらく、リストで何をしたいかによっては、中間ファイルさえ必要ないかもしれません。
Daniel Andersson、

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.