grepを使用して複数のネストされていないディレクトリを検索するにはどうすればよいですか?


20

この質問と同じことを求めているように聞こえるかもしれませんが、要件は異なります。これは私のファイルシステムの例です:

  • /コード/
    • 内部/
      • dev /
      • メイン/
    • 公衆/
      • dev /
      • メイン/
      • リリース/
    • ツール/

/code/internal/dev//code/public/dev/および/code/tools/複数のプロジェクトのサブディレクトリが含まれます。私は/code/internal/とのdevブランチでほぼ独占的に仕事をしており/code/public/、それらのディレクトリで/code/tools/(ブランチのない)テキスト文字列を検索したいことがよくあります。これらのインスタンスでは、3つの個別のコマンドを実行する必要があります。

$ grep -r "some string" /code/internal/dev/
$ grep -r "some string" /code/public/dev/
$ grep -r "some string" /code/tools/

これを行う単一のコマンドがあるかどうかを知りたいです。そうでない場合は、おそらく単純なbashスクリプトを作成する必要があります。

回答:


38

grepが検索する複数のパスを連結できます。

grep -r "some string" /code/internal/dev/ /code/public/dev/ /code/tools/

これはとても明白です。なぜ私はこれを考えなかったのですか?!
デビッドケネディ14

実際、コマンドからgrep: /code/internal/dev/*.cs: No such file or directoryを削除しない限り、これはエラーをスローします*.cs*.cs私が最初に質問に入れたので、これは私のせいです。
デビッドケネディ14

14

ワイルドカードを最大限に活用したい場合(および投稿した階層が完全な場合)、次のことができます。

grep -r "some string" /code/{*/dev,tools}/*.cs

説明:

最初に行うステップは、ブレースリストの展開です。foo{bar,baz}quxに展開されfoobarqux foobazquxます。つまり、リスト内の各コンマ区切りアイテムに対して生成された個別の単語があり、それぞれにプレフィックスとポストフィックスの部分が付加されています。あなたはそれがどのように機能するかを見ることができます

echo A{1,2,3,4}B

どの出力

A1B A2B A3B A4B

これは、複数の中括弧、および空の引数でも機能することに注意してください。例えば

echo {,1,2}{0,1,2}:{2,3}

与える

0:2 0:3 1:2 1:3 2:2 2:3 10:2 10:3 11:2 11:3 12:2 12:3 20:2 20:3 21:2 21:3 22:2 22:3

したがって、ブレース展開後、コマンドは次のようになります。

grep -r "some string" /code/*/dev/*.cs /code/tools/*.cs

次のステップはワイルドカード拡張です。その*.cs部分についてはすでに知っていますが、中間ディレクトリでも機能します。さらに、aが/続く場合、ディレクトリのみが一致します。したがって、階層(およびファイルのファイル名を.cs作成)を指定すると、次のコマンドが表示されます。

grep -r "some string" /code/internal/dev/file1.cs /code/internal/dev/file2.cs /code/public/dev/file3.cs /code/tools/file4.cs /code/tools/file5.cs

このすべてが起こった後にのみ、grepこの引数のリストと呼ばれている(同じことがあなたの元のコマンドで起こることに注意してください。grep確認するために取得することはありません*。それは完全にすることによって行われ拡大してbash呼び出す前にgrep)。

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