Как мне использовать переменную, чтобы указать путь для исключения в `find`?

Я пытаюсь использовать переменную, чтобы указать путь исключения в find команда.

Этот фрагмент работает:

x="*test/.util/*"
y="*test/sh/*"

find test -type f -name "*.sh" -not -path "$x" -not -path "$y"

Но я бы хотел переехать -not -path в переменные, как в:

x="-not -path *test/.util/*"
y="-not -path *test/sh/*"

# error: find: -not -path *test/.util/*: unknown primary or operator
find test -type f -name "*.sh" "$x" "$y"

# Tried removing quotes
# error: find: test/.util/foo.sh: unknown primary or operator
find test -type f -name "*.sh" $x $y 

Я также попытался добавить кавычки к путям в переменных, но это не привело к фильтрации путей.

# no syntax error but does not exclude the paths
x="-not -path '*test/.util/*'"
y="-not -path '*test/sh/*'"

Я использую OSX Mavericks; GNU bash, версия 3.2.51(1)-релиз (x86_64-apple-darwin13).

Что я делаю неправильно? Спасибо

1 ответ

Решение

find получает -not -path *test/.util/* как один аргумент, а не как 3 отдельных аргумента, которые ему требуются. Вместо этого вы можете использовать массив.

x=(-not -path "*test/.util/*")
y=(-not -path "*test/sh/*")

find test -type f -name "*.sh" "${x[@]}" "${y[@]}"

Когда цитируется, ${x[@]} раскрывается в серию отдельных слов, по одному на элемент массива, и каждое слово остается в кавычках, поэтому шаблоны передаются буквально, как и предполагалось, find,

Другие вопросы по тегам