假设我有一个名为 的文件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.
答案1
您可以使用xargs
:
locate filename123 | xargs vi
默认情况下xargs
将执行尽可能少的指定命令实例,并根据系统的情况传递尽可能多的参数ARG_MAX。要限制传递给 实例的参数数量vi
,请使用xargs
' -n
option.
要处理包含空格的文件名,请使用xargs
'-d
选项:
locate filename123 | xargs -d '\n' vi
要处理包含换行符的文件名,请使用xargs
'-0
选项和locate
's-0
选项:
locate -0 filename123 | xargs -0 vi
(如果-0
其中任何一个都不可用,--null
也请检查,或使用其他方式指定字符\000
作为分隔符。)
答案2
答案3
最简单的方法是传递locate
为外壳替换, 喜欢:
vim $(locate filename123)
您还可以考虑使用find
而不是locate
传递文件名进行编辑,例如:
find . -name 'filename123' -exec vim {} +
在 Unix/OSX 上,您可以使用xargs
参数-o
,例如:
locate filename123 | xargs -o vim
-o
在执行命令之前,在子进程中将 stdin 重新打开为 /dev/tty。如果您希望 xargs 运行交互式应用程序,这非常有用。
或者在 Linux 上尝试使用以下解决方法:
locate filename123 | xargs -J% sh -c 'vim < /dev/tty $@'
如果您使用不同的命令,请使用命令替换为了实现这一点,例如:
vim $(locate filename123)
vim `locate filename123`
或者使用 GNUparallel
而不是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 "$@"
有关的:
- 使用 xargs 调用 Vim 后终端停止运行在 Vim SE