ファイルをgrepして、一致した結果を開く

ファイルをgrepして、一致した結果を開く

コマンドラインで grep からの戻り値に基づいてすべてのファイルを開こうとしています。-lファイル名のみを返すオプションを使用できることはわかっていますが、これを別の一連のフラグまたは引数と組み合わせて、上記のファイルの完全なパスを生成したいと考えています。

私は次のようなことを試しました:

find . -iname "*.ext" | xargs grep -l "mystring" | xargs open

また、次のようなものもあります:

grep -HR -l mystring . | xargs open

あまり成功しませんでした。すべてのサブディレクトリに再帰的にアクセスしたいことに注意してください。この質問、完全には関連がありません。

アップデート:

私はこのような仕事を得ることができました

grep -HR -l mystring . | xargs -L 1 open

問題は、多くのファイルに対して、コマンド ラインが次の 2 つの方法でエラーを報告してしまうことです。

LSOpenURLsWithRole() failed with error -1712 for the file /Users/blah/blah.ext

The files /blah/blah/file.ext do not existパスにスペースが含まれる場合。

答え1

print0ファイル名にスペースが含まれている場合は、ファイルにはオプション、-0にはlater xargs-I {}2 番目にはlastly を使用する必要がありますxargs

find . -iname "*.maxpat" -print0 | xargs -0 grep -l "mystring" | xargs -I '{}' open '{}'

emacsコマンドとしてテストしましたopen

答え2

-exec入力したコマンドの終了ステータスを取得し、それを論理的に使用します。find

だから、こんな簡単なことでもうまくいくはずだ

find . -iname "*.ext" -exec grep -q "mystring" {} \; -exec open {} \;

答え3

使用しているのバージョンがわかりませんgrepが、 のマニュアル ページを正しく読んでいるのであればgrep、最初の一致が成功した後にスキャンが停止します。これが必要なのですか? 質問から私が理解したのは、"すべてのファイルを開く" 必要があるということでした。

vimまたはを使用しても構わない場合はgvim、次のように使用できます。

$ grep -n mystring *.ext > /tmp/mystring.list
$ vim -q /tmp/mystring.list

(は/をvim読み取らないので、これら 2 つのコマンドを組み合わせようとしたことはありません)quickfixerrorfilestdin

Vim は の最初のファイルを開き/tmp/mystring.list、 が見つかった行に直接カーソルを置きますmystring。 を使用して次のインスタンスに移動したり:cn、 を使用して前のインスタンスに移動したりできます:cp

あなたがvimユーザーではなく、リンクされた質問があまり役に立たなかったと言ったのであれば、find ... -print0すでに示唆されているように、が役立つはずです。

答え4

検索して使用pwd:

find `pwd` -iname *.maxpat | xargs grep -l "mystring" | xargs open

関連情報