私が自分でよくやっていることは、findコマンドを実行してから、viでそれらをすべて編集することです。これは次のようになります。
> find . "*.txt"
./file1.txt
./file2.txt
./path/to/file3.txt
> vi ./file1.txt ./file2.txt ./path/to/file3.txt
これをすべて1つのコマンドラインで行う賢くて簡単な方法はありますか?
これでうまくいくはずです:
_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
_に加えて、その後、完全に偽の動作をするターミナルが生成されます。ユーザーの不便さは、以下のコメントで理由を説明し、 この質問 でもう少し説明しました。
またはvimを実行し、そこから:
:args **/*.txt
さらに、一度に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
すべてを編集するには*.txt
、次のように実行できます:vim *.txt
。 find
によって返されたファイルを編集するには、さらに読んでください。
Unix/macOSでは、BSDでfind
を使用できますxargs
(参照:man xargs
)、例えば.
find -L . -name "*.txt" -type f -print0 | xargs -o -0 vim
-o
(xargs
):コマンドを実行する前に、子プロセスで/ dev/ttyとしてstdinを再度開きます。
関連: xargsでVimを呼び出した後にターミナルが中断されました Vim.SEで。
find
コマンドを入力済みの場合は、xargs
を使用して検索結果を開く方がはるかに簡単であることがわかります。
find . -name "*.txt" | xargs vim -p
-p
オプションは、vimに各ファイルを新しいタブで開くように指示します。これはバッファを使用するよりも便利だと思いますが、そうしない場合は、そのオプションを省略してください。