Criar lista de exclusão de diretório programaticamente para o comando Localizar (Bash)
Eu tenho uma matriz de diretórios para excluir do resultado do meu comando find, algo comoEXCLUDE=("foo" "bar")
.
Eu posso executar isso no terminal interativo da seguinte maneira:
find . -name 'hvr.yml' -not -path "foo/*" -not -path "bar/*"
E então eu tentei construir o argumento assim:
getServersToCheck() {
# Build command arguments to exclude given dirs
local exclude_command="-not -path"
local excount=${#EXCLUDE[@]}
for ((i=0;i<excount;i++)); do
EXCLUDE[i]="${exclude_command} ${EXCLUDE[i]}/*"
done
find . -name 'hvr.yml' "${EXCLUDE[@]}"
}
Mas isso resulta em encontrar lançando um erro de predicado desconhecido: '-not -path foo / *'
Existe maneira de conseguir isso? Quando eu ecoo o comando, parece correto, mas deve haver algumas regras de sintaxe do bash que estão fazendo com que isso não funcione como eu esperava.
ATUALIZAR:
Eu adicionei\"
ao redor do caminho para excluir enquanto li que o globbing ocorre apenas com strings entre aspas. O xtrace mostra o seguinte:
find . -name hvr.yml -not -path '"foo/*"' -not -path '"bar/*"'
As aspas simples podem ser o problema
Removendo o\"
e executando com xtrace mostra que o globbing está sendo aplicado no loop for, resultando em:
find . -name hvr.yml -not -path "foo/fileinfoo" "foo/somethingelseinfoo" -not -path "bar/*" "bar/fileinbar" "bar/otherfilesinbar"
E assim, encontrar está reclamando sobre caminhos aleatórios sendo dados como argumentos.
Existe uma maneira de expandir a matriz EXCLUDE e adicionar / * no final de cada elemento no comando?