コマンドラインで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
fileオプション、それ以降の-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つのコマンドを組み合わせたことはありません。)quickfix
errorfile
stdin
Vimは最初のファイルを開き、見つかった行に/tmp/mystring.list
直接カーソルを置きます。mystring
次のインスタンスに移動を使用し、:cn
前のインスタンスに移動するために使用できます:cp
。
あなたがユーザーではなく、リンクされたvim
質問があると言ったのであまり役に立たない場合は、find ... -print0
すでに提案されているとおりです。
答え4
pwd
検索を使用する:
find `pwd` -iname *.maxpat | xargs grep -l "mystring" | xargs open