
コマンドラインで 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 つのコマンドを組み合わせようとしたことはありません)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