如何“定位”多个文件并在vim中打开它们?


10

假设我有一个名为的文件filename123.txt,它是这样命名的单个文件,我可以locate使用命令locate filename123。并且它仅返回该文件。

现在我想用vi/ 打开它vim。但我不想转到该位置并键入vi命令,后跟文件名。在这里,我希望将结果locate filename123附加到vi命令。我该怎么办?我已经尝试过:

locate filename123 | vi

但这是行不通的。并且此错误出现在终端中:

santosh@santosh:~$ locate filename123 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.

Answers:


12

您可以使用xargs

locate filename123 | xargs vi

默认情况下,xargs将执行尽可能少的指定命令实例,并根据系统的ARG_MAX传递尽可能多的参数。要限制传递给实例的参数数量vi,请使用xargs' -n选项。

要处理包含空格的文件名,请使用xargs' -d选项:

locate filename123 | xargs -d '\n' vi

要处理包含换行符的文件名,请使用xargs' -0选项和locate' -0选项:

locate -0 filename123 | xargs -0 vi

(如果-0它们中的任何一个都不可用,请检查是否--null也有,或以其他方式将字符指定\000为定界符。)


您能告诉我是什么原因阻止了我打开此文件?
Santosh Kumar 2012年

1
@Santosh您正在将locate命令的输出作为输入传递给vi。Vi与其他任何程序一样,期望文件名作为参数来使用。
吉尔(Gilles)'所以别再邪恶了'

@manatwork问题是我无法找到并打开带有空格的文件名。例如,此命令将在vim中打开多个文件:找到I \ have \ to \ download | xargs vi
Santosh Kumar 2012年

3

您可以使用命令扩展:

vi "$(locate filename123 | head -n1)"

vim读取其stdin,可以执行vim -,但这只会为您locate提供文件名路径的输出。但是,这可能会起作用,使用vim gf普通命令将打开光标所在的路径。

编辑

如果文件名中带有空格,则最好使用上述xargs选项或上述vim解决方案。请注意,要进行gf工作,您需要为增加空间isfname

set isfname+=32

这个技巧和替代描述这里

编辑2

添加引号,并head根据PeterO在评论中的建议。


对于其中包含空格的文件,当我在文件名中插入\时,例如vi $(定位另一个\文件)。Vim的打开它作为两个独立的文件,anotherfile:(。
桑托斯·库马尔

仅当我要查找的文件中没有空格时,您的答案才有效。
Santosh Kumar 2012年

答案已更新。
雷神

2
@Thor:对于单个文件,如问题中所述,您只需要在过程替换处用引号引起来:vi "$(locate filename123)"...以确保它只处理一个文件名:vi "$(locate filename123 |head -n1)"
Peter.O 2012年

PeterO:没错,我只进行了多次匹配测试。我已将您的评论添加到答案中。
雷神

1

最简单的方法是locate作为shell替代传递,例如:

vim $(locate filename123)

您还可以考虑使用find而不是locate传递文件名进行编辑,例如:

find . -name 'filename123' -exec vim {} +

在Unix / OSX可以使用xargs-o参数,如:

locate filename123 | xargs -o vim

-o在执行命令之前,在子进程中以/ dev / tty重新打开stdin。如果您希望xargs运行交互式应用程序,这将很有用。

或者在Linux上,尝试使用以下解决方法:

locate filename123 | xargs -J% sh -c 'vim < /dev/tty $@'

如果您使用其他命令,请使用命令替换来实现,例如:

vim $(locate filename123)
vim `locate filename123`

或者,使用GNU parallel代替xargs强制tty分配,例如:

locate filename123 | parallel -X --tty vi

注意:parallel在Unix / OSX上,由于参数不同且不支持tty,因此无法使用。

许多其他流行的命令也提供了伪tty分配(如-t中的ssh),因此请查看帮助。

其他建议是使用vipe(Vim命令管道)或使用以下简单脚本:

#!/bin/sh
# usage: locate filename123 | vip
exec vim < /dev/tty "$@"

有关:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.