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


27

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

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

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

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


1
パイプでvi:findにパイプできます。「* .txt」| xargs vi
MaQleod

1
@MaQleod:技術的にはxargsにパイピングします。
-grawity


xargsシェルターミナルを破壊するための配管。適切な解決策は、@ DevSolar
typelogic

回答:


41

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

find . -name "*.txt" -exec vim {} + 

Vimを使用してください。健康に良いです。:-)

すべてのファイル名(行の長さ制限まで)を1行に表示する+ための見落とされがちなオプション-exec。つまり、1つの vimセッションですべてのファイルを開いたままにします(:n次の:Nファイルと前のファイルでナビゲートします)。

ではvim -p、あなたは、各ファイルのファイルタブを取得します。詳細:help tab-page-commandsを確認してください。

ではvim -o、あなたは、各ファイルの水平方向の分割ウィンドウを取得するvim -O垂直ウィンドウを分割します。詳細:help window-move-cursorを確認してください。

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

にパイピングするとxargs viWarning: Input is not from a terminalに加えて、完全に偽の動作をするターミナルが追加されます。以下のコメントでユーザーの悲しみの理由を説明し、この質問でもう少し説明しました


4
vimについてどれだけ知っているかわかりませんが、:n /は次のファイルを示し、:Nは前のファイルを示すことを理解するのに/ forever /かかりました。
zpletan

4
@DevSolar:Vimは、stdinがその制御端末と同じであることを期待し、stdinでさまざまな端末関連のioctlを直接実行します。(これはバグと考えることができます。Vimは確かにその上でioctl()を開いて呼び出すことができ/dev/ttyます;それを行うのは面倒です。)xargsによって呼び出されると、vimは/dev/null標準入力として受け取ります。
-grawity

3
@zpletan:vim -pファイルタブが必要な場合。(gtそしてgT、ナビゲートするか、マウスでクリックします。)
粗さ

2
参考までに、にパイピングするときの警告を回避vimするに-は、のように最初の引数として指定するだけecho foobar | vim -です。
コンラッドルドルフ

2
@Konrad Rudolph:見つかったファイルの名前find . -name "*.txt" | vim -含む名前のないファイルでvimセッションを提供します。これはOPが要求したものではありません
...-DevSolar


1

また、一度に1つずつ開く場合は、find -execを使用するか、単純なforループを使用することもできます。 セビングのコメントごとに編集。

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

または

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

...しかし、なぜあなたはそれをしたいのですか?
DevSolar

@DevSolar最初はfindの機能を指摘することで、2番目は汎用ループです。編集する前に、すべてのファイルに何かをしたいかもしれません。
オールドウルフ

2回目を試したことはありますか?最初:見つからないため、検索は現在のディレクトリを返します-name。次に、ファイル名にスペースが含まれるとすぐにコマンドが悲惨に失敗します。賢明でない答えの場合は-1。
セビング

実際、ファイル名のスペースの件名は私の答えにも当てはまります。コマンドラインから独自の小さなスクリプトに変換せずに適切に処理する方法を考えることさえできません。ファイル名のスペースが推奨されないのには十分な理由があります。
DevSolar

@ceving有効なポイント。私は、元のポスターが彼のニーズに合っていたと思った。編集。
オールドウルフ

0

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

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

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


私が見つけるために接続したので、私のコマンドは次のとおりです。xargs vim -p
talsibony

0

すべてを編集するには*.txt、次を実行しますvim *.txt。で返されたファイルを編集するにはfind、さらに読んでください。


Unix / macOSでは、findBSDで使用できますxargs(参照man xargs:)

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

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

関連:Vim.SEでxargsを使用してVimを起動した後、ターミナルが停止しました。

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