
特定のファイルを含めたり除外したりして、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
これは を使用して行うことができますfind
。find
除外と包含のコンテキストでの の一般的な使用法については、以下を参照してください。除外と包含を含むファイルを再帰的に検索する。
問題には 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.log
がapp1.error.log
ディレクトリ タイプの場合、「含まれる」または「除外される」がディレクトリのみを指すのか、ディレクトリとその下のすべてを指すのかは明確ではありません。file1.log
および はセットアップ内の通常のファイルである可能性が高いため、これはおそらく問題にはなりません。ちなみに、上記の各コマンドは、開始点の下のディレクトリ ツリー全体をトラバースします。たとえば、
file1.log
がディレクトリ タイプの場合、のテストは! -name file1.log
停止しません。サブツリーを除外するには、 が必要です。find
file1.log/foo
-prune
find
find
再帰的に動作します。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 …
、ポータブルではないですが。