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

  • / code /
    • internal /
      • dev /
      • main /
    • public /
      • dev /
      • main /
      • release /
    • tools /

/code/internal/dev//code/public/dev//code/tools/には複数のプロジェクトのサブディレクトリが含まれています。私はほぼ独占的に/code/internal//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スクリプト。

A nswer

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

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

コメント

  • これは非常に明白です。なぜ'これを考えなかったのですか?!
  • 実際、これを削除しない限り、エラーgrep: /code/internal/dev/*.cs: No such file or directoryがスローされます。コマンドから*.cs。もともと質問に*.csを入れたので、これは私のせいです。

回答

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

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

説明:

実行される最初のステップは、ブレースリストの拡張です。 foo{bar,baz}quxfoobarqux 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の部分についてはすでにご存知ですが、中間ディレクトリでも機能します。さらに、 /が続く場合、ディレクトリのみが一致します。したがって、階層(および.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が呼び出されます。 uments(元のコマンドでも同じことが起こることに注意してください。 grep*を表示することはありません。これは、grepを呼び出す前に、bashによって完全に実行されます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です