我通常像这样使用
$ find -name testname.c
./dir1/dir2/testname.c
$ vi ./dir1/dir2/testname.c
再次键入带有位置的文件名会很烦人。
我怎么只用一步就可以做到这一点?
我试过
$ find -name testname.c | xargs vi
但我失败了。
将-exec
参数用于find
。
$ find -name testname.c -exec vi {} ;
如果您的find
返回多个匹配项,则文件将按顺序打开。也就是说,当你关闭一个时,它会打开下一个。你不会让它们都在缓冲区排队。
要在缓冲区中打开它们,请使用:
$ vi $(find -name testname.c)
顺便说一句,这真的是vi吗?而不是Vim,现在vi经常被别名为Vim?
您可以在bash中使用以下命令:
要么使用
vi `find -name testname.c`
或者使用
vi $(!!)
如果您已经键入find -name testname.c
编辑:可能的重复:bash-自动将上次执行的命令的输出捕获到变量中
问题是xargs
接管了vi
在那里的所有输入(并且在没有其他追索权的情况下,将/dev/null
传递给vi
,因为另一种选择是传递文件列表的其余部分),没有留下任何与它交互的方式。您可能想使用子命令:
$ vi $(find -name testname.c)
遗憾的是,在运行了初始find
之后,没有简单的fc
或r
调用可以轻松地为您做到这一点,尽管在之后将字符添加到命令的两端已经足够容易了。
我最喜欢的解决方案是使用vim本身:
:args `find -name testname.c`
顺便说一句,VIM内置了扩展的shell globbing,所以你可以说
:args **/testname.c
其将在子目录树中递归地找到。
也不是,VIM在命令行上有文件名完成,所以如果你知道你真的在寻找一个文件,试试
:e **/test
然后按选项卡(重复)在子目录树中的任何匹配文件名之间循环。
对于比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