我通常像这样使用
$ find -name testname.c
./dir1/dir2/testname.c
$ vi ./dir1/dir2/testname.c
再次输入位置文件名是很烦人的。
我怎么能只用一步呢?
我试过
$ find -name testname.c | xargs vi
但我失败了。
答案 0 :(得分:10)
将-exec
参数用于find
。
$ find -name testname.c -exec vi {} \;
如果您的find
返回多个匹配项,则会按顺序打开这些文件。也就是说,当你关闭一个时,它会打开下一个。你不会把它们全部排在缓冲区中。
要将它们全部打开缓冲区,请使用:
$ vi $(find -name testname.c)
顺便说一下,这真的是vi,而不是Vim,现在vi经常被别名?
答案 1 :(得分:6)
您可以使用bash中的以下命令执行此操作:
使用
vi `find -name testname.c`
或使用
vi $(!!)
如果您已输入find -name testname.c
编辑:可能重复:bash - automatically capture output of last executed command into a variable
答案 2 :(得分:4)
问题是xargs
接管了vi
的所有输入(并且没有其他追索权,然后将/dev/null
传递给vi
,因为替代方案是传递文件列表的其余部分),无法与之交互。您可能想要使用子命令:
$ vi $(find -name testname.c)
遗憾的是,在您运行初始fc
之后,没有简单的r
或find
调用可以轻松地为您执行此操作,尽管将两个字符添加到两端都很容易事后的命令。
答案 3 :(得分:3)
我最喜欢的解决方案是使用vim本身:
:args `find -name testname.c`
顺便说一句,VIM扩展了shell globbing内置,所以你可以说
:args **/testname.c
将在子目录树中递归查找。
也不是,VIM在命令行上有文件名完成,所以如果你知道你真的在寻找一个文件,那就试试
:e **/test
然后按 Tab (重复)在子目录树中的任何matchin文件名之间循环。
答案 4 :(得分:1)
对于比vi $(find -name testname.c)
之类更强大的东西,以下内容将防止具有空格和其他解释的shell字符的文件名(如果您的文件名中嵌入了换行符,上帝帮助您)。将此函数注入shell环境:
# Find a file (or files) by name and open with vi.
function findvi()
{
declare -a fnames=()
readarray -t fnames < <(find . -name "$1" -print)
if [ "${#fnames[@]}" -gt 0 ]; then
vi "${fnames[@]}"
fi
}
然后使用
$ findvi Classname.java