有没有办法配置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
答案 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