find を使用してファイルをインポートし、grep を使用します。

find を使用してファイルをインポートし、grep を使用します。

だから私はコマンドラインに最初に触れました。ファイルに特定の場所がないため、findを使用して複数のディレクトリから複数のファイルの出力を取得できました(短縮できると確信しています)。

find ./ -name filename1.ext && find ./ -name filename2.ext && find ./ -name filename3.ext

これで私は欲しいリストを提供しますが、今問題のファイルを見つけたので、そのファイルを見つけて情報を取得しようとしています。

答え1

nameすべての項目をfindステートメントにグループ化し、findにgrepを実行させることができます。

find . \( -name filename1.ext -o \
      -name filename2.ext -o \
      -name filename3.ext \) \
      -exec grep 'pattern' {} \;

答え2

この試み、

find ./ -type f \( -name filename1.ext -o -name filename2.ext -o -name filename3.ext \) -exec grep 'string' {} \;
  • -type fファイルを探しているので、より高速な結果を得るためにタイプを指定することをお勧めします。

  • -o検索にさらにファイル名を追加できる「または」を示します。

答え3

正解は実際に-oandを使用することです-exec。前のコマンドの出力をキャプチャして1行ずつ解析する一般的な方法は次のとおりです。

(find .... && find ... && cat ... && ls ... && ...) | while read line; do grep string $line; done

答え4

find一般に、+結合には少なくとも3つの方法がありますgrep

  1. grep 模様 `find 目次 指定子の検索 -print`
  2. find 目次 指定子の検索 -exec grep 模様 {} \;
  3. find 目次 指定子の検索 -print | xargs grep 模様

もちろんgrepここには特別なものはありません。この同じ 3 つのパターンをすべてのコマンドfindで使用できます。

ある意味では、方法1は最も古く、最も基本的な方法です。バックティックは、常にあるコマンドの出力をキャプチャして別のコマンドのコマンドラインで使用する方法だったからです。 (最近、バックティックよりも良いバシズムが新しくなって、素敵な子供たちは使い尽くすような気がしますが、私は昔ながらかと思います。find

2番は、+コマンドの組み合わせをfind実行するために組み込まれた特殊機能です。find一度は大丈夫ですが、2つの欠点があります。 (1)grep見つかったすべてのファイルに対して補助コマンド(または他のコマンド)を再度呼び出すことで速度が遅くなる可能性があり、(2)補助コマンドが次の場合、grep各呼び出しにgrepファイル名が表示されるため、一致するファイル名表示されません。ただし、次の手順を実行してこの問題を解決できます。-exec grep 模様 {} /dev/null \;または最近-exec grep -H 模様 {} \;

それから3番目。私が知る限り、xargs最初の2つの制限を克服するために発明されました。xargs理論的には汎用プログラムですが、実際には、および他のプログラムペアと一緒にfind使用されることがほとんどないと考えられますgrep。これは最初の欠点を完全に解決します。見つかったファイルの数に関係なく動作します。うまくいきますが、運が良くない場合は時々最後のファイル名を呼び出すことになるので、まだorトリックをgrep使いたいという意味です。独自の欠点があります。見つかったファイル名にスペースが含まれていると機能しません。しかし、回避策もあります。/dev/null-H

find 目次 指定子の検索 -print0 | xargs -0 grep 模様

xargs(デフォルトでは、スペースの代わりに改行で区切られたファイル名を許可するように作成したいのですが、これは別の日の好言状になります。)

関連情報