funções são características da linguagem shell. /bin/zsh
é um comando que é um interpretador da linguagem zsh
. find
é outro comando destinado a encontrar arquivos. Com -exec
, ele pode executar um comando. Uma função zsh não é um comando.
find
precisaria ter zsh
interpretando o código na função. Para isso, seria necessário invocar zsh
de uma maneira que informa para carregar o código dessa função e executá-lo com o arquivo encontrado. Isso pode ser feito com:
find ... -exec zsh -c "(){$functions[finderpackage];}"' "$@"' zsh {} \; ...
(acima, estamos chamando zsh
com um script embutido (com -c
) cujo conteúdo usa uma função anônima ( (){code} args
) onde o código é copiado do da função finderpackage
no shell que chama esse comando find
).
Mas isso significa invocar um comando zsh
por arquivo que será terrivelmente ineficiente.
zsh
globbing tem recursos e qualificadores recursivos que o tornam quase equivalente a find
, mas, infelizmente, uma coisa que falta é a capacidade de controlar como a travessia do diretório é feita de maneira arbitrária.
Você pode remover diretórios com base no nome deles, como:
setopt extendedglob
print -rl -- (^*.pkg/)#*(.)
Para remover os diretórios *.pkg
. Mas você não pode remover diretórios antigos ou conter este ou aquele arquivo, por exemplo. Para isso, você teria que recorrer à passagem manual do diretório.
Uma coisa que você pode fazer, embora não seja muito eficiente, é interagir com find
como coproc
e usar seu -ok
:
coproc stdbuf -o0 find . -type f -exec printf 'f:%sfind ... -exec zsh -c "(){$functions[finderpackage];}"' "$@"' zsh {} \; ...
' {} \; -o \
-type d -exec printf 'd:%ssetopt extendedglob
print -rl -- (^*.pkg/)#*(.)
' {} \; -ok true \; -prune 2> /dev/null
while IFS=: read -rpd '' type file; do
case $type in
(d)
if finderpackage $file; then
print -p y
du -sk $file
else
print -p n
fi;;
(f)
du -k $file
esac
done