Вам не нужно расширять $@
, но вы должны перебрать его:
for arg in "$@"
do
[ "${#arg}" -gt 2 ] && printf '%s\n' "$arg"
done
Код ${#arg}
запрашивает длину (в байтах )из $arg
.
Помимо отказа от кавычек слов, содержащих подстановочные символы в именах файлов, вы также инвертировали смысл всех -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
по-прежнему будет выводить пути к вещам, совпадающим до этой точки.
Другой способ сделать это:
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
пропускать все каталоги, указанные в скобках.