将“find”命令的输出重定向到“vim”

18

我正在执行查找命令 $PWD -name 'filename' | vim -

期望文件名为 filename 的文件能在 vim 编辑器中打开,但是没有成功。 在这种情况下,我确信只有一个名为 'filename' 的文件存在。

同时,find 命令的结果会在 stdout 中显示完整路径。


1
使用 command | vim - 命令告诉 Vim 读取 command 的输出并将其放入缓冲区中(而不是打开这些文件)。 - idbrii
@pydave,我在你的评论中错过了“-”号。很重要! - Jonathan Hartley
2
顺带一提,vim <(command)也可以使用Bash进程替换来完成相同的操作,而且这不仅限于vim。例如,要查看两个目录之间的差异,请使用diff <(ls -l dir1) <(ls -l dir2) - Jonathan Hartley
4个回答

29
vim "$(find "$PWD" -name 'filename')"
或者
find "$PWD" -name 'filename' -exec vim {} \;

顺带一提,你可以省略"$PWD"。默认情况下,find 会从当前目录开始搜索。


1
这对我不起作用。vim "$(find "$PWD" -name 'filename')"打开一个新文件,其名称是从查找输出的所有文件名连接而成的。这是在OSX上。 - Jonathan Hartley
9
在使用 find 命令时,如果想要在一个 vim 实例中打开多个文件(以便可以在 :args 中访问它们),建议使用 + 运算符来连接结果,而不是使用 ; 操作单个结果。因此,可以使用以下命令:find "$PWD" -name 'filename' -exec vim {} + - idbrii
2
顺便提一下,你可以删除"$PWD"。如果你需要完整路径(而不是相对路径),添加$PWD可能会有所不同。(例如,如果你要将结果写入文件中。) - idbrii
3
这不起作用是因为您引用了输出结果。如果您不引用输出结果(并且文件名中没有空格),它是否能正常工作?无论如何,最好使用“-exec”(与“+”一起使用)。 - idbrii
1
@JonathanHartley:在您最后的示例中(使用+),您还可以使用“vim -o”在分割中打开它们(另请参阅“-O”和“-p”)。此外,您不需要转义+,因为对bash没有特殊含义。 - idbrii
显示剩余3条评论

9

find . -name 'filename' -print0 | xargs -0 vim

这个命令也可以使用。你可能想要了解一下xargs,它是一个很方便的工具。


2
这对我不起作用。find . -name 'utility' -print0 | xargs -0 vim 会打开一个新文件,其名称是从 find 命令的输出串联而成的。这是在OSX上的情况。 - Jonathan Hartley
啊,原帖明确指出只有一个匹配的文件。因此我的反对意见就减轻了。 - Jonathan Hartley

4

在 @idbrii 的评论中提到,但我最喜欢的是:

find . -name 'filename' -type f -exec vim {} \+

这将每个找到的文件都在自己的缓冲区中打开,可用:next:prev进行导航。已在OSX上测试,但我相当确定它也适用于Linux。


3

我觉得一种非常简单的方法是用反引号(大多数键盘下波浪线下面的字符)将查找命令包含起来,并将其传递给vim。

vim `find . -name myfile`

实际上,你可以在任何命令中使用反引号来获取该命令的文字字符串输出。


这个回答怎么没有更多的投票?!?太聪明了! - Rasmus Groth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接