6

我通常这样使用

$ find -name testname.c
./dir1/dir2/testname.c
$ vi ./dir1/dir2/testname.c

再次输入带有位置的文件名很烦人。

我怎么能只用一步来做到这一点?

我试过了

$ find -name testname.c | xargs vi 

但我失败了。

4

5 回答 5

9

使用-exec参数来find

$ find -name testname.c -exec  vi {} \;

如果您find返回多个匹配项,则文件将按顺序打开。也就是说,当您关闭一个时,它将打开下一个。您不会让它们都在缓冲区中排队。

要让它们在缓冲区中全部打开,请使用:

$ vi $(find -name testname.c)

顺便说一句,这真的是 vi,而不是现在 vi 经常被别名的 Vim?

于 2012-04-06T02:34:17.600 回答
6

您可以在 bash 中使用以下命令执行此操作:

要么使用

vi `find -name testname.c` 

或使用

vi $(!!)

如果您已经输入find -name testname.c

编辑:可能的重复:bash - 自动将最后执行的命令的输出捕获到变量中

于 2012-04-06T03:04:52.570 回答
4

问题是xargs接管vi那里的所有输入(并且没有其他追索权,然后传递/dev/null给,vi因为替代方法是传递文件列表的其余部分),让您无法与之交互。您可能想改用子命令:

$ vi $(find -name testname.c)

遗憾的是,在您运行 initial 之后,没有简单的fc或调用可以轻松地为您完成此操作,尽管事后将字符添加到命令的两端很容易。rfind

于 2012-04-06T02:43:32.383 回答
3

我最喜欢的解决方案是使用 vim 本身:

:args `find -name testname.c`

顺便说一句,VIM 已经扩展了 shell globbing builtin,所以你可以说

:args **/testname.c

它将在子目录树中递归找到。

也不是,VIM 在命令行上有文件名完成,所以如果你知道你真的在寻找一个文件,试试

:e **/test

然后按Tab(重复)在子目录树中的任何匹配文件名之间循环。

于 2012-04-06T10:13:39.090 回答
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
于 2015-04-06T20:52:10.437 回答