web-dev-qa-db-ja.com

Linuxのviでfindによって返されたすべてのファイルを編集するにはどうすればよいですか?

私が自分でよくやっていることは、findコマンドを実行してから、viでそれらをすべて編集することです。これは次のようになります。

> find . "*.txt"
./file1.txt
./file2.txt
./path/to/file3.txt

> vi ./file1.txt ./file2.txt ./path/to/file3.txt

これをすべて1つのコマンドラインで行う賢くて簡単な方法はありますか?

27
abeger

これでうまくいくはずです:

_find . -name "*.txt" -exec vim {} + 
_

Vimを使用してください。健康に優れています。 :-)

_+_のよく見落とされている_-exec_オプションは、すべてのファイル名(行の長さの制限まで)を1行で表示します。つまり、すべてのファイルをoneで開いたままにします。 vimセッション(次の場合は_:n_、前のファイルの場合は_:N_でナビゲート)。

_vim -p_を使用すると、各ファイルのファイルタブが表示されます。詳細については、_:help tab-page-commands_を確認してください。

_vim -o_を使用すると、各ファイルの水平分割ウィンドウ、_vim -O_垂直分割ウィンドウが表示されます。詳細については、_:help window-move-cursor_を確認してください。

この回答の以前のバージョンであるvim $(find . -name "*.txt")は、ファイル名にスペースを使用すると機能せず、セキュリティに影響することに注意してください。

_xargs vi_にパイプすると、_Warning: Input is not from a terminal_に加えて、その後、完全に偽の動作をするターミナルが生成されます。ユーザーの不便さは、以下のコメントで理由を説明し、 この質問 でもう少し説明しました。

41
DevSolar

またはvimを実行し、そこから:

:args **/*.txt
4
Benoit

さらに、一度に1つずつ開く場合は、find -execを使用するか、単純なforループを使用することもできます。 cevingのコメントに従って編集。

find . -name "*.txt" -exec vi {} \;

または

OLDIFS=$IFS
IFS=$(echo -en "\n\b")
for i in `find . -name "*.txt"`
    do
        vi $i
    done
IFS=$OLDIFS
1
OldWolf

すべてを編集するには*.txt、次のように実行できます:vim *.txtfindによって返されたファイルを編集するには、さらに読んでください。


Unix/macOSでは、BSDでfindを使用できますxargs(参照:man xargs)、例えば.

find -L . -name "*.txt" -type f -print0 | xargs -o -0 vim

-oxargs):コマンドを実行する前に、子プロセスで/ dev/ttyとしてstdinを再度開きます。

関連: xargsでVimを呼び出した後にターミナルが中断されました Vim.SEで。

1
kenorb

findコマンドを入力済みの場合は、xargsを使用して検索結果を開く方がはるかに簡単であることがわかります。

find . -name "*.txt" | xargs vim -p

-pオプションは、vimに各ファイルを新しいタブで開くように指示します。これはバッファを使用するよりも便利だと思いますが、そうしない場合は、そのオプションを省略してください。

0
Cory Klein