複数のファイルを「検索」してvimで開く方法は?


10

という名前のファイルがあり、その名前が付けられfilename123.txtているのが単一のファイルでありlocate、コマンドでそれを行うことができるとしlocate filename123ます。そして、それはこのファイルだけを返します。

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

locate filename123 | vi

しかし、これは機能しません。そしてこのエラーはターミナルで起こります:

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

回答:


12

使用できますxargs

locate filename123 | xargs vi

デフォルトでxargsは、指定されたコマンドのインスタンスをできるだけ少なく実行し、システムのARG_MAXに従ってできるだけ多くのパラメーターを渡します。のインスタンスに渡されるパラメータの数を制限するにはvixargs' -nオプションを使用します。

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

locate filename123 | xargs -d '\n' vi

改行が使用含むハンドルファイル名にxargs-0と一緒にオプションをlocates」の-0オプション:

locate -0 filename123 | xargs -0 vi

-0これらのいずれでも使用できない場合は、チェック--nullするか\000、区切り文字として文字を指定する別の方法を確認してください。)


このファイルを開く前に何が原因で何ができなかったのか教えていただけますか?
Santosh Kumar

1
@Santosh locateコマンドの出力を入力としてviに渡していました。Viは、他のプログラムと同様に、ファイル名が引数として機能することを期待しています。
Gilles「SO-邪悪なことをやめ

@manatwork問題は、スペースを含むファイル名を見つけて開くことができないことです。たとえば、このコマンドはvimで複数のファイルを開きます:I \ have \ to \ downloadを探します| xargs vi
Santosh Kumar

3

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

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

作るためにvimあなたが行うことができますそのSTDINを読んでvim -、それはちょうどあなたの出力与えるlocateファイル名のパスであるが。これは機能するかもしれませんが、vim gf通常のコマンドを使用すると、カーソルが置かれているパスが開きます。

編集する

ファイル名にスペースが含まれている場合は、xargs上記のオプションまたは上記のvim解決策を使用することをお勧めします。gfスペースを追加する必要がある作業を行うために注意してくださいisfname

set isfname+=32

ここでは、このヒントと代替案について説明します

編集2

引用符を追加し、headPeterOがコメントで提案したとおり。


空白を含むファイルの場合、vi $(locate another \ file)のようにファイル名に\を挿入すると、vimのは、2つの別々のファイルとしてそれを開き、anotherそしてfile:(。
Santosh Kumar氏

あなたの答えは、探しているファイルにスペースがない場合にのみ機能します。
Santosh Kumar

回答を更新しました。
トール

2
@Thor:単一のファイルの場合、質問で述べたように、プロセス置換を引用符で囲む必要があります:vi "$(locate filename123)"... 処理するファイル名が1つだけであることを確認するには:vi "$(locate filename123 |head -n1)"
Peter.O

PeterO:そうです、私は複数のヒットでのみテストしました。回答にコメントを追加しました。
トール

1

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

vim $(locate filename123)

find代わりにを使用locateして、編集するファイル名を渡すこともできます。次に例を示します。

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

UNIX / OSX上では使用することができるxargs-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をサポートしていないため、機能しません。

ウェル(などの他の多くの人気のあるコマンドは、仮想端末の割り当てを提供-tssh)、その助けをチェック。

他の提案は使用することですvipe(Vimのコマンドパイプ)、または以下のような簡単なスクリプトを使用します。

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

関連:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.