我通常这样使用
$ 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,而不是现在 vi 经常被别名的 Vim?
您可以在 bash 中使用以下命令执行此操作:
要么使用
vi `find -name testname.c`
或使用
vi $(!!)
如果您已经输入find -name testname.c
编辑:可能的重复:bash - 自动将最后执行的命令的输出捕获到变量中
问题是xargs
接管vi
那里的所有输入(并且没有其他追索权,然后传递/dev/null
给,vi
因为替代方法是传递文件列表的其余部分),让您无法与之交互。您可能想改用子命令:
$ vi $(find -name testname.c)
遗憾的是,在您运行 initial 之后,没有简单的fc
或调用可以轻松地为您完成此操作,尽管事后将字符添加到命令的两端很容易。r
find
我最喜欢的解决方案是使用 vim 本身:
:args `find -name testname.c`
顺便说一句,VIM 已经扩展了 shell globbing builtin,所以你可以说
:args **/testname.c
它将在子目录树中递归找到。
也不是,VIM 在命令行上有文件名完成,所以如果你知道你真的在寻找一个文件,试试
:e **/test
然后按Tab(重复)在子目录树中的任何匹配文件名之间循环。
对于比其他更强大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