如何在 Linux 中编辑 vi 中 find 返回的所有文件?

abe*_*ger 29 linux vi find

我发现自己经常做的事情是运行一个 find 命令,然后在 vi 中编辑它们,它看起来像这样:

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

> vi ./file1.txt ./file2.txt ./path/to/file3.txt
Run Code Online (Sandbox Code Playgroud)

有没有一种聪明而简单的方法可以在一个命令行中完成这一切?

Dev*_*lar 44

这应该可以解决问题:

find . -name "*.txt" -exec vim {} + 
Run Code Online (Sandbox Code Playgroud)

使用 Vim,它对您的健康更好。:-)

使所有文件名(最多行长度限制)出现在一行中的经常被忽视的+选项-exec,即您仍然可以在一个 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, 再加上一个具有完全虚假行为的终端。用户 grawity 在下面的评论中解释了原因,并在这个问题中有更多的解释。

  • 不知道您对 vim 了解多少,但我 /forever/ 花了我才弄清楚 :n 显示下一个文件, :N 显示前一个文件。 (4认同)
  • @DevSolar:Vim 期望其标准输入与其控制终端相同,并直接在标准输入上执行各种与终端相关的 ioctl。(你可以认为这是一个错误。Vim当然*可以*打开`/dev/tty`并在其上调用ioctl();它只是懒得去做。)当被xargs调用时,vim收到`/dev/null`作为它的标准输入,它只是忽略终端控制 ioctl。 (4认同)
  • @zpletan:如果你想要文件标签,`vim -p`。(`gt` 和 `gT` 用于导航,或用鼠标单击。) (3认同)
  • 仅供参考,为了避免在管道输入 `vim` 时出现警告,只需指定 `-` 作为第一个参数,如 `echo foobar | vim -`。 (2认同)
  • @康拉德鲁道夫:`找到。-name "*.txt" | vim -` 为您提供一个未命名文件的 vim 会话,其中包含找到的文件的 *names*,这不是 OP 要求的... (2认同)

Ben*_*oit 5

或者运行 vim 并从那里:

:args **/*.txt
Run Code Online (Sandbox Code Playgroud)