gpt4 book ai didi

bash - 如何完成相对于另一个目录的文件名?

转载 作者:行者123 更新时间:2023-11-29 09:04:38 25 4
gpt4 key购买 nike

这是讨论的后续问题:

https://bugs.launchpad.net/ubuntu/+source/bash-completion/+bug/1394920

假设我有一个文件夹 ~/tmp一些文件和目录:

$ mkdir a; touch file1.txt; mkdir a/b; mkdir a/c; touch a/d; mkdir a/b/c

我现在尝试制作一个完成脚本来完成 ~/tmp 中的文件名,但是 complete -o filenames仅当当前目录为 ~/tmp 时选项才能正常工作.

有关更多背景信息,请参阅上面的链接。据我所知:

$ cat setup
_compTest() {
local cur baseFolder
cur="${COMP_WORDS[$COMP_CWORD]}"
baseFolder=~/tmp
compopt -o nospace
COMPREPLY=( $(
cd "$baseFolder"
if [[ ${cur: -1} != "/" && -d $cur ]] ; then
echo "$cur/"
else
compgen -f "$cur"
fi
) )
}
complete -F _compTest aaa

然后我获取它:

$ . setup

然后我可以做

$ aaa <tab><tab>
  • 问题 1:完成列表中的目录名末尾没有添加斜杠(这是为了方便地在完成列表中将目录与文件名分开)

  • 问题 2:对于 aaa a/<tab><tab>完成列表是 a/b a/c a/d但是 a/前缀不应该在那里。应该是b/ c/ d相反。

最佳答案

我会把这个函数写成:

_compTest () 
{
local cur; local tmp; local tmp_escaped; local i;
_get_comp_words_by_ref cur;
local _compreply=()
tmp=~/tmp/
tmp_escaped=${tmp//\//\\\/}
cur=$tmp$cur;

if [ "$1" == "-d" ]; then
_cd
else
_filedir;
fi;
for i in "${COMPREPLY[@]}"; do
[ -d "$i" ] && [ "$i" != "$tmp." ] && [ "$i" != "$tmp.." ] && i="$i/"
_compreply=("${_compreply[@]}" "$i")
done

COMPREPLY=(${_compreply[@]/$tmp_escaped/})
} && complete -o nospace -F _compTest aaa_files

_compTestDir()
{
_compTest -d
} && complete -o nospace -F _compTestDir aaa_directories

它有3个部分,

  1. $cur 前加上您的基本目录 - ~/tmp。
  2. 使用用于 cd/ls 等的标准 bash 完成例程 _filedir
  3. COMPREPLY 中删除 ~/tmp

仅作记录:您可以使用此逻辑来完成相对于许多其他类型路径的文件名,例如

  1. 我用它来完成强制路径 //...
  2. 您还可以完成相对于您的 public_html 目录的 http://localhost/* 路径。

关于bash - 如何完成相对于另一个目录的文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27244300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com