複数のファイルを「見つけて」vimで開く方法は?

複数のファイルを「見つけて」vimで開く方法は?

というファイルがあるとしましょう。filename123.txtこのファイルには名前が付けられているため、locateコマンドを使用できますlocate filename123。このファイルが返されます。

vi今/で開きたいですvim。ただし、その場所に移動してviコマンドとファイル名を入力したくありません。ここではlocate filename123viコマンドに結果を追加したいと思います。どうすればいいですか?私は努力しました:

locate filename123 | vi

しかし、これはうまくいきません。このエラーは端末に表示されます。

santosh@santosh:~$ locate filename123 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.

答え1

あなたはそれを使用することができますxargs

locate filename123 | xargs vi

デフォルトでは、指定さxargsれたコマンドのインスタンスをできるだけ少なく実行し、システムに適切な引数を渡します。ARG_MAX。インスタンスに渡される引数の数を制限するには、「オプション」をvi使用します。xargs-n

スペースを含むファイル名を処理するには、xargs'-dオプションを使用します。

locate filename123 | xargs -d '\n' vi

改行文字を含むファイル名を処理するには、xargs'-0オプションとlocate's-0オプションを使用します。

locate -0 filename123 | xargs -0 vi

(また、-0これらのうち使用できないものを--null確認するか、別の方法で文字を区切り\000文字として指定してください。)

答え2

コマンド拡張を使用できます。

vi "$(locate filename123 | head -n1)"

標準入力を読み取るには、vim次のことができますが、これはファイル名パス出力のみを提供しますvim -。通常のコマンドを使用すると、カーソルがあるパスが開いて動作することがlocateあります。vim gf

編集する

xargsファイル名にスペースが含まれている場合は、上記のオプションまたは上記の回避vim策を使用することをお勧めします。これがgf機能するにはスペースを追加する必要がありますisfname

set isfname+=32

この技術と代替案が説明されています。ここ

編集2

引用符を追加し、headPeterOの提案に従いました。コメント

答え3

最も簡単な方法は、次のようlocateに渡すことです。シェルの交換、よい:

vim $(locate filename123)

編集のためにファイル名を渡すfind代わりに使用を検討することもできます。たとえば、次のようになります。locate

find . -name 'filename123' -exec vim {} +

xargsUnix/OSX では、次のパラメータを使用できます-o

locate filename123 | xargs -o vim

-oコマンドを実行する前に、サブプロセスで/ dev / ttyでstdinを再度開きます。これは、xargsに対話型アプリケーションを実行させる場合に便利です。

または、Linuxで次の回避策を試してください。

locate filename123 | xargs -J% sh -c 'vim < /dev/tty $@'

別のコマンドを使用している場合は、次を使用します。コマンドの置き換えこれを達成するには、例えば次のようにします。

vim $(locate filename123)
vim `locate filename123`

あるいは、tty割り当てを強制するparallel代わりにGNUを使用してください。たとえば、次のようになります。xargs

locate filename123 | parallel -X --tty vi

注:parallelUnix / OSXではパラメータが異なり、ttyをサポートしていないため機能しません。

他の多くの一般的なコマンドも疑似tty割り当て(例-t:)を提供していますので、sshヘルプを確認してください。

他の提案は次のとおりです。vipe(Vimコマンドパイプライン)または次の簡単なスクリプトを使用してください。

#!/bin/sh
# usage: locate filename123 | vip
exec vim < /dev/tty "$@"

関連:

関連情報