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

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

我已经有一个别名可以(更)快速地搜索文件:

alias f='find . -iname'

我这样使用它:

$ f *statis*
./main/statistics.py
./test/test_statistics.py

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

我尝试过(为了调试目的使用“echo”而不是“vim”):

 alias fvi='find . -exec echo {} + -iname'

...但似乎-exec取消了-iname随后发生的事情:

$ fvi *statis*
 ./main/statistics.py ./main/probability.py ./test/test_statistics.py 
 ./test/test_probability.py

答案1

由于-exec {}参数必须位于之后-iname(因为find“执行”它的参数是从左到右),因此您无法使用别名执行您想要的操作。相反,让您的别名调用包含以下内容的脚本,例如:

#!/bin/sh
find . -iname "$1" -exec vi {} \;

请注意,这vi将对找到的每个文件调用一次。如果有许多这样的文件,您将执行许多:q!ZZ来退出它们。如果您想调用一个实例来vi编辑找到的所有文件,请将 更改\;+

find . -iname "$1" -exec vi {} +

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

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

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

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

fvi () { find . -iname "$1" -exec vi {} + ; }

答案2

...或者使用肮脏的黑客来使用别名仿佛它采用参数...

正如一些答案所指出的那样,别名不像 shell 脚本和函数那样支持参数。调用别名相当于将别名扩展为其值,然后在所有参数保持不变的情况下执行生成的命令行。

不会发生参数替换。如果要进行参数替换,请定义函数而不是别名。只需按几次键即可:

fvi () { find . -iname "$1" -exec vi {} + ; }

但是,如果你坚持的话,这里有一个在别名扩展中引用命令行参数的技巧:从 shell 历史记录中获取它们。对于你的情况,这将完成工作:

alias fvi='find . -iname "$(history|tail -n1|sed -e "s/^.*\sfvi\s*//")" -exec vi {} + #'

子 shell 执行的输出history | tail -n1 | sed -e "s/.*\sfvi\s*//"是 后面的内容fvi。这些内容被拼接到find . -iname HERE -exec vi {} +命令中,这正是您所需要的。

除了……别名定义末尾有一个奇怪的井号。我留给读者自己去弄清楚存在的理由,因为揭开全面黑客的面纱而带来的微笑。;-)

答案3

如果你真的需要别名,那么您可以使用这个答案。


中的别名bash不接受参数。因此,您需要一个函数、一个别名和一个略微更改的find命令:

  1. 编辑您的.bashrc

    nano ~/.bashrc
    

    并在文件末尾添加以下几行

    myfvi() {
        find . -type f -iname "$1" -exec vi -o {} +
    }
    alias fvi=myfvi
    
  2. 重新加载配置或注销并重新登录

    source ~./bashrc
    
  3. 从...开始

    fvi '*statis*'
    

    但你也可以直接使用函数

    myfvi '*statis*'
    

例子

我的文件夹中有三个文件

$ ls -laog
total 4288
drwxrwxr-x  2 4329472 Sep  7 11:43 .
drwx------ 67   20480 Sep  7 11:28 ..
-rw-rw-r--  1       0 Sep  7 11:43 bar
-rw-rw-r--  1       4 Sep  7 11:23 foo
-rw-rw-r--  1       4 Sep  7 11:23 foobar

当我使用别名时

fvi 'foo*'

vi打开两个文件。

在此处输入图片描述

相关内容