使用find命令在文本编辑器中打开多个文件

时间:2012-10-03 19:58:07

标签: perl shell unix vim

我试图使用此命令从命令行在vim中打开多个文件。出于某种原因,我会得到一个错误,你将在下面看到。

 $ find . -name edit.html.erb  \
     | perl -pi -e 's/^..//'   \
     | perl -pi -e 's/\n$/ /'  \
     | vim

当我在没有“| vim”的情况下运行它时,如此命令:

 $ find . -name edit.html.erb  \
     | perl -pi -e 's/^..//'   \
     | perl -pi -e 's/\n$/ /'

获得此输出:

 addresses/edit.html.erb claims/edit.html.erb emails/edit.html.erb owners/edit.html.erb packages/edit.html.erb users/edit.html.erb vessels/edit.html.erb voyages/edit.html.erb %

我收到的错误可能与输出末尾的“%”标记有关。

这是输出和错误:

 Vim: Warning: Input is not from a terminal
 Vim: Error reading input, exiting...
 Vim: preserving files...
 Vim: Finished.

我该如何解决这个问题?不确定哪个部分导致错误,因为我是一个新手,但任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:9)

您正在将文件的内容作为键盘输入传递。我想你要做的是在文件打开的情况下启动vim。我不知道vim,但这通常是通过将文件名作为参数传递来实现的。

在bash中,人们会使用:

vim $( find . -name edit.html.erb | perl -pe's/^..//' | perl -pe's/\n$/ /' )

(删除了对-i的无意义使用。)

实际上,将换行更改为空格是没用的,删除前导./也是如此,所以您只需要:

vim $( find . -name edit.html.erb )

答案 1 :(得分:3)

让我们看一下vim的文档:

SYNOPSIS
   vim [options] [file ..]
   vim [options] -
   vim [options] -t tag
   vim [options] -q [errorfile]

这告诉我们,我们可以指定许多文件名作为命令行参数,-表示将从STDIN加载“文件”。但这不是文件名,而是缓冲区内容!

让你的Perl脚本exec使用正确的args进入vim。

exec "vim", @filenames;

或类似的。这将使你的工具链

 $ find . -name edit.html.erb  \
   | perl -pi -e 's/^..//'   \
   | perl -ne 'chomp; push @files, $_; }{ exec "vim", @files'

(你真的确定要删除任何文件名的前两个字符吗?这就是s/^..//的作用。转义点以匹配文字.

答案 2 :(得分:3)

管道输入vim的标准输入将不会做任何事情(无论如何都有帮助)。您想要传递命令行参数,而不是输入。在bash中,请使用反引号或$(...)语法。

vim `find . -name edit.html.erb | perl -pe's/^..//' | perl -pe's/\n$/ /'`
vim $(find . -name edit.html.erb | perl -pe's/^..//' | perl -pe's/\n$/ /')

(Perl的-i选项在这里也没有做任何事情。当您在命令行上提供文件名时,该选项用于“就地”编辑文件。)

答案 3 :(得分:1)

不要忘记辅助操作系统:vim

:args `find . -name edit.html.erb`
:argadd `find . -name edit.html.js`

甚至

:args **/edit.html.erb

(另见:argdelete,:args,:argdo等)

(其他答案几乎击败了使用某些文件名参数调用vim的其他路径)