Acredite que pode ser melhor usar compgen
em vez de find
neste caso.
Você provavelmente já tem um script de conclusão com o sistema. Tente por exemplo.
locate bash_completion
Nas variantes do Debian, isso provavelmente é:
/usr/share/bash-completion/bash_completion
onde você encontra, por exemplo %código%. Então a maneira mais simples seria algo na direção de:
*)
pushd "/some/path" >/dev/null
_filedir
popd >/dev/null
Se isso não for uma opção, isso pode ser um começo:
_comp_by_path()
{
local opt cur dir
local IFS=$'\n' x tmp
local -a tokens
opt="$1"
cur="$2"
dir="$3"
# Enter target directory
pushd "$dir" >/dev/null
# Get directories, filtered against current
[[ "$opt" != "-f" ]] && \
x=$( compgen -d -- "$cur" ) &&
while read -r tmp; do
tokens+=( "$tmp" )
done <<< "$x"
# Get files, filtered against current
[[ "$opt" != "-d" ]] && \
x=$( compgen -f -- "$cur" ) &&
while read -r tmp; do
tokens+=( "$tmp" )
done <<< "$x"
# If anything found
if [[ ${#tokens[@]} -ne 0 ]]; then
# Make sure escaping is OK
compopt -o filenames 2>/dev/null
COMPREPLY+=( "${tokens[@]}" )
fi
# Go back
popd >/dev/null
}
_GetOptMyCommand()
{
local cur
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "-h -l --help --list --" -- "$cur" ) );;
*)
_comp_by_path "any" "$cur" "/some/path"
esac
}
complete -F _GetOptMyCommand my_command
Uma variante usando _filedir
poderia ser algo em direção a isso:
_zaso()
{
local dir="$1"
pushd "$dir" >/dev/null
find * -maxdepth 0 2>/dev/null
popd >/dev/null
}
_comp_with_find()
{
local cur dir
local IFS=$'\n'
cur="$1"
dir="$2"
compopt -o filenames 2>/dev/null
COMPREPLY=( $( compgen -W "$(_zaso "$dir")" -- "$cur" ) );
}
Observe também que find
no Bash tem uma opção printf
. Então, para gerar strings citadas, esta é uma opção para brincar com:
find * -maxdepth 0 2>/dev/null && \
while read -r tmp; do
printf "%q\n" "$tmp"
done <<< "$x"
Além disso, os nomes de arquivo não podem ter caracteres de nova linha nos quais muito disso será quebrado. Não encontrei uma maneira de usar %q
com
. compgen