У меня есть массив каталогов, которые нужно исключить из результата моей команды поиска, что-то вроде 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, которые заставляют это работать не так, как я ожидаю.
UPDATE:
Я добавил \"
вокруг пути, чтобы исключить, так как я прочитал, что сглаживание происходит только со строками в кавычках. 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 и добавить / * в конец каждого элемента команды?