在终端(dash/bash)中对文件名中间的部分匹配进行自动完成

在终端(dash/bash)中对文件名中间的部分匹配进行自动完成

我有一堆目录:

20130118-Cars_Directory
20130118-Bikes_Directory
20130218-Planes_Directory
20130228-Scooters_Directory

有没有办法通过在命令中间输入部分匹配的方式来更改目录。

理想情况下,采用某种风格的cd *Bikes*<TAB>,并让 dash 自动完成其余部分?

答案1

您可以通过为 cd 创建别名并根据需要定义 bash 补全来实现这一点。请参阅巴赫完成手册

以下是分步指南。我将使用“scd”作为新命令,但您也可以使用“cd”。

1)编辑.bashrc文件

gedit ~/.bashrc  

2)创建别名
将其粘贴到“.bashrc”文件的最后:

# Alias for making a "Super cd"

alias scd="cd"

_scd_completion() {
    mapfile -t COMPREPLY < <(ls -d */ | grep "${COMP_WORDS[COMP_CWORD]}")
}
complete -F _scd_completion scd

保存并关闭。

3)打开一个新终端
或者运行: source ~/.bashrc

4)如何使用

只需调用该命令,后跟您要去的目录的名称的一部分。

scd Bikes<TAB>

完成。尽情享用吧!

答案2

事实上,巧合的是,它cd *Bikes*<RETURN>无需对系统进行任何更改就可以工作。

我只是有点震惊它不需要引号*Bikes*

答案3

尝试使用名为,它可以满足您的需要,另外它还会创建一个按频率加权的 CD 全局数据库,并允许您立即跳转到经常访问的地方。

如果你已经访问过 Bikes 目录,你可以稍后输入

z Bikes

你会跳到那里

答案4

desuga 的回答可以,但区分大小写。

如果您不想区分大小写,则文件~/.bashrc应该是:

# Alias for making a "Super cd"

alias scd="cd"

_scd_completion() {
    mapfile -t COMPREPLY < <(ls -d */ | grep -i "${COMP_WORDS[COMP_CWORD]}")
}
complete -F _scd_completion scd

相关内容