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

ファイル名にスペースが含まれている場合は、print0fileオプション、それ以降の-0オプションxargs、最後に-I {}2番目のオプションを使用する必要があります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

(/ fromが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

関連情報