Как исключить из поиска несколько папок, соответствующих подстановочным знакам

Вам не нужно расширять $@, но вы должны перебрать его:

for arg in "$@"
do
  [ "${#arg}" -gt 2 ] && printf '%s\n' "$arg"
done

Код ${#arg}запрашивает длину (в байтах )из $arg.

0
16.05.2020, 11:41
2 ответа

Помимо отказа от кавычек слов, содержащих подстановочные символы в именах файлов, вы также инвертировали смысл всех -nameтестов, что привело к сокращению имен, которые не соответствуют этим именам и шаблонам из дерева поиска..

Вместо:

find /app/test -type d \
    \( -name 'logs*' -o -name log -o -name 'tmp*' -o -name tmp \) -prune -o \
    -print | tee /tmp/findall.log

Тест -pruneбез -printпо-прежнему будет выводить пути к вещам, совпадающим до этой точки.

1
28.04.2021, 23:13

Другой способ сделать это:

find /app/test -type d \( -path "*/log*" -o -path "*/tmp" \) -prune -o -print | tee /tmp/findall.log

Обратите внимание, что при использовании -pathсопоставляется полное имя каталога; следовательно, использование переднего подстановочного знака *в шаблонах глобусов.

Также обратите внимание, что "*/tmp"соответствует только путям с каталогами, названными точно tmp, а не каталогами с именами, например, tmp2или tmporary; в то время как "*/log*"будет соответствовать любому пути, включая имя каталога, начинающееся с log.

-pruneзаставляет findпропускать все каталоги, указанные в скобках.

1
28.04.2021, 23:13

Теги

Похожие вопросы