В противном случае он создает регулярное выражение для grep для фильтрации, которое в конечном итоге выглядит как (abc | def) для этого примера.
я есть массив каталогов для исключения из результата моей команды поиска, что-то вродеEXCLUDE=("foo" "bar")
.
Я могу запустить это из интерактивного терминала следующим образом:
find . -name 'hvr.yml' -not -path "foo/*" -not -path "bar/*"
И поэтому я попытался создать аргумент так:
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[@]}"
}
Но это приводит к тому, что find выдает неизвестную ошибку предиката: '-not -path foo / *'
Есть ли способ достичь этого? Когда я повторяю команду, она выглядит правильно, но должны быть некоторые правила синтаксиса bash, которые заставляют это работать не так, как я ожидаю.
ОБНОВИТЬ:
я добавил\"
вокруг пути, чтобы исключить, поскольку я читал, что сглаживание происходит только со строками в кавычках. xtrace показывает следующее:
find . -name hvr.yml -not -path '"foo/*"' -not -path '"bar/*"'
Единственные кавычки, возможно, являются проблемой
Удаление\"
и выполнение с xtrace показывает, что глобализация применяется в цикле for, что приводит к:
find . -name hvr.yml -not -path "foo/fileinfoo" "foo/somethingelseinfoo" -not -path "bar/*" "bar/fileinbar" "bar/otherfilesinbar"
И поэтому find жалуется на случайные пути в качестве аргументов.
Есть ли способ расширить массив EXCLUDE и добавить / * в конец каждого элемента в команде?