我已经有一个别名可以(更)快速地搜索文件:
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
命令:
编辑您的
.bashrc
nano ~/.bashrc
并在文件末尾添加以下几行
myfvi() { find . -type f -iname "$1" -exec vi -o {} + } alias fvi=myfvi
重新加载配置或注销并重新登录
source ~./bashrc
从...开始
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
打开两个文件。