别名按名称搜索文件并在vim中打开它们

Man*_*nur 1 vim command-line bash alias find

我已经有了(更多)快速搜索文件的别名:

alias f='find . -iname'
Run Code Online (Sandbox Code Playgroud)

我这样使用它:

$ f *statis*
./main/statistics.py
./test/test_statistics.py
Run Code Online (Sandbox Code Playgroud)

现在,我想要另一个别名来执行相同的搜索,但不是打印出找到的文件,而是在 vim 中打开它们。理想情况下,它会在找到多个文件时工作。

我试过(使用 'echo' 而不是 'vim' 进行调试):

 alias fvi='find . -exec echo {} + -iname'
Run Code Online (Sandbox Code Playgroud)

...但似乎-exec取消了-iname之后的到来:

$ fvi *statis*
 ./main/statistics.py ./main/probability.py ./test/test_statistics.py 
 ./test/test_probability.py
Run Code Online (Sandbox Code Playgroud)

zwe*_*ets 6

由于-exec {}参数必须在-iname(因为find从左到右“执行”它的参数)之后,所以你不能使用别名做你想做的事。而是让您的别名调用包含以下内容的脚本:

#!/bin/sh
find . -iname "$1" -exec vi {} \;
Run Code Online (Sandbox Code Playgroud)

请注意,这将为vi找到的每个文件调用一次。如果有很多这样的文件,你会做很多:q!'s 或ZZ's 来摆脱它们。如果要调用 的一个实例vi来编辑找到的所有文件,请将 更改\;为 a +

find . -iname "$1" -exec vi {} +
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用命令替换将参数提供给vi

vi $(find . -iname "$1")   # do not use when file names may contain whitespace
Run Code Online (Sandbox Code Playgroud)

然而,这样做的缺点是它会在包含空格的文件名上失败。

如果您不想为命令创建脚本文件,请将语句放在 shell 函数中:

fvi () { find . -iname "$1" -exec vi {} + ; }
Run Code Online (Sandbox Code Playgroud)

  • 已经对此进行了投票,但是对可能不值得在答案中涵盖的边缘情况有点挑剔,但第二种方法将在包含换行符的文件名上失败;如果有人需要避免这种情况,他们可能会使用 `find 。-iname "$1" -print0 | xargs -0 -I file vi file` (3认同)
  • 我正要发布一个与此非常相似的答案。唯一的区别是我建议将它实现为 shell 函数,并且我会用 `+`(如 OP)而不是 `\;` 来终止 `-exec` 以避免不必要的进程分叉。这将导致只有一个 Vim 实例被启动。 (2认同)