Как мне использовать переменную, чтобы указать путь для исключения в `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
,