Bash:所有子文件夹上的Tab文件名完成

时间:2016-10-30 21:41:10

标签: bash command-line tab-completion

有没有办法配置bash,以便点击标签扩展文件名将搜索所有子文件夹以及当前文件夹?

e.g。我的文件夹结构

readme.txt
colors/blue.txt
colors/red.txt
people/roger.txt

我希望less r<tab>(或者less **/r<tab>展开以展示以r开头的所有扩展选项:

readme.txt colors/red.txt people/roger.txt

1 个答案:

答案 0 :(得分:1)

假设存在以下情况,包括两个级别的子目录:

.
├── colors
│   ├── blue.txt
│   └── red.txt
├── completion.bash
├── people
│   ├── rdir
│   ├── roger.txt
│   └── subdir
│       └── rhino.txt
└── readme.txt

您可以使用此功能获得所需的完成程度:

_comp_less () {
    # Store current globstar setting and set globstar if necessary
    local glob_flag
    if shopt -q globstar; then
        glob_flag=0
    else
        glob_flag=1
        shopt -s globstar
    fi

    # $2 is the word being completed
    local cur=$2

    # Loop over all files and directories in the current and all subdirectories
    local fname
    for fname in **/"$cur"*; do

        # Only add files
        if [[ -f "$fname" ]]; then
            COMPREPLY+=("$fname")
        fi
    done

    # Set globstar back to previous value if necessary
    if (( glob_flag == 1 )); then
        shopt -u globstar
    fi

    return 0
}

它检查globstar shell选项并在必要时设置它(如果它没有设置为开始,则再次取消设置),然后使用**/"$cur"* glob来获取所有文件和完成当前单词的目录(包括子目录),最后过滤出目录名称。

该功能可以放在您的.bashrc中,并附带用于less的说明:

complete -F _comp_less less

现在,less r<tab>完成如下:

$ less r
colors/red.txt           people/subdir/rhino.txt
people/roger.txt         readme.txt