【问题标题】:Opening multiple files in text editor with find command使用 find 命令在文本编辑器中打开多个文件
【发布时间】:2012-09-24 19:37:47
【问题描述】:

我正在尝试使用此命令从命令行在 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.

我该如何解决这个问题?由于我是新手,不确定是哪个部分导致了错误,但我们将不胜感激!

【问题讨论】:

  • % 不是您的提示符,不是输出的一部分吗?
  • 是的,这是我的提示。 (或者至少在我使用 sed 时会发生同样的事情。)我试图打开 rails 项目中的所有编辑视图,因为我需要向所有这些视图添加一些内容。因此,找到首先过滤掉我的选择。

标签: perl shell unix vim


【解决方案1】:

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

在 bash 中,人们会使用:

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

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

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

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

【讨论】:

    【解决方案2】:

    让我们看看 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/^..// 所做的。转义点以匹配文字 .

    【讨论】:

    • 对此并不完全熟悉,但我会尽力弄清楚!你认为可以从命令行完成吗?
    • 是的。我不想删除前两个字符,因为 find 的输出是这样的:“./path/to/file”,因此不会打开。 PS。 “它有效!”
    【解决方案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 选项在这里也不起作用。当您在命令行上提供文件名时,该选项用于“就地”编辑文件。)

    【讨论】:

      【解决方案4】:

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

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

      甚至

      :args **/edit.html.erb
      

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

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

      【讨论】:

        猜你喜欢
        • 2016-08-15
        • 2019-01-29
        • 1970-01-01
        • 1970-01-01
        • 2016-04-11
        • 1970-01-01
        • 2020-06-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多