В противном случае он создает регулярное выражение для 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 и добавить / * в конец каждого элемента в команде?

Ответы на вопрос(1)

Ваш ответ на вопрос