web-dev-qa-db-ja.com

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

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

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

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

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

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

23
Big McLargeHuge

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

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

ワイルドカードを最大限に活用したい(そして投稿した階層が完成した)場合は、

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

説明:

行われる最初のステップは、ブレースされたリストの拡張です。 foo{bar,baz}quxfoobarqux foobazquxに展開されます。つまり、リスト内のコンマ区切りの項目ごとに生成された個別のWordがあり、それぞれに接頭辞と接尾辞の部分が付加されています。あなたはそれがどのように機能するかを見ることができます

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部分についてはすでにご存じですが、中間ディレクトリに対しても機能します。さらに、/が続く場合は、ディレクトリのみが一致します。したがって、階層が(および.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によって完全に実行されます。

14
celtschk