いくつかのファイルを含めたり除外したりして、異なるディレクトリからファイルを検索する

いくつかのファイルを含めたり除外したりして、異なるディレクトリからファイルを検索する

特定のファイルを含めたり除外したりして、3 つの異なるフォルダーからファイルを検索したい。
フォルダ1:

  • パス: /var/www/app/var/log/
  • 除外するファイル: file1.log と file2.log

フォルダ2:

  • パス: /var/log/web/log/
  • 含める: error.log

フォルダ3:

  • パス: /var/log/service/log/
  • 含める: app1.error.log と app2.error.log

この場合、3 つの異なるフォルダーからファイルを検索するにはどうすればよいでしょうか?

答え1

これは を使用して行うことができますfindfind除外と包含のコンテキストでの の一般的な使用法については、以下を参照してください。除外と包含を含むファイルを再帰的に検索する

問題には 3 つのパスと、それぞれに異なる要件が関係しています。 の 1 回の呼び出しで複数の開始点を指定してfind式を構築し ( など-path)、異なるパスに対して異なるテストを実行することができます。 これは可能ですが、かなり面倒です。 簡単な方法は、3 つの別々の find コマンドを順番に実行することです。

find /var/www/app/var/log ! -name file1.log         ! -name file2.log
find /var/log/web/log       -name error.log
find /var/log/service/log   -name app1.error.log -o   -name app2.error.log

ノート:

  • 上記のコマンド内の複数のスペースは、その構造と類似性を強調するためだけに使用されています。

  • 「ファイルを探したい」とおっしゃるなら、上記のコマンドでファイルディレクトリ タイプのファイルを含みます。特に、最初のコマンドは独自の開始点 ( …/log) を検索します。通常のファイルを検索するには、 のみが必要です。-type fディレクトリ以外のファイルを検索するには、 のみが必要です! -type d

  • またはfile1.logapp1.error.logディレクトリ タイプの場合、「含まれる」または「除外される」がディレクトリのみを指すのか、ディレクトリとその下のすべてを指すのかは明確ではありません。file1.logおよび はセットアップ内の通常のファイルである可能性が高いため、これはおそらく問題にはなりません。

    ちなみに、上記の各コマンドは、開始点の下のディレクトリ ツリー全体をトラバースします。たとえば、file1.logがディレクトリ タイプの場合、のテストは! -name file1.log停止しません。サブツリーを除外するには、 が必要です。findfile1.log/foo-prune

  • findfind再帰的に動作します。GNU がサブディレクトリに降りないようにする最も簡単な方法は です-maxdepth 1。非 GNU 実装ではサポートされない可能性があります。純粋な POSIX ではfind それはそんなに単純ではない

    タグ付けした; Ubuntu は GNU をfindそのまま提供しているので、-maxdepth 1自由に使用できます。

  • 適切な使用法-o あなたが望むほど簡単ではない

  • シンボリック リンクが関係している場合は、 の および オプションについて読んでください-H-Lそのman 1 findうちの 1 つを使用することをお勧めします。


これらを念頭に置いて、3番目のコマンドの例を作成します。多分あなたのニーズにぴったり合うもの:

find /var/log/service/log/ -maxdepth 1 -type f \( -name app1.error.log -o -name app2.error.log \)

または POSIX 的に(回答を一般の読者にとってより役立つものにするため):

find /var/log/service/log/. \( -name . -o -prune \) -type f \( -name app1.error.log -o -name app2.error.log \)

後者のコマンドの開始点の最後のコンポーネントは で終わります.。これにより、汎用的なソリューションを使用できます (つまり、フォームは-name . -o -prune開始点パスの実際に意味のある部分に依存しません)。一方、はすべてのパス名に をfind含めます/.が、これは望ましくない場合があります。


を 1 つではなく3findつ実行しても、結果を単一の宛先にパイプすることはできます (例xargs)。

{ find … ; find … ; find … ; } | xargs …

Ubuntuでは次のことができますfind … -print0 | xargs -r0 …。これはより堅牢よりはfind … -print | xargs …、ポータブルではないですが。

関連情報