Para evitar a descida em *[xyz] e para arquivos regulares na profundidade 2 (encontre a/x , mas não ax/x nem a/b nem x e não olhe além de dois diretórios como a/b/x ), POSIXly:
LC_ALL=C find . \( ! -name '*[xyz]' -o -prune \) \
-path './*/*' -prune -type f -name '*[xyz]'
Isso seria o equivalente de:
printf '%s\n' *[!xzy]/*[xyz]
Só que ele também procuraria dentro de diretórios ocultos e por arquivos ocultos e não procuraria links simbólicos para diretórios e procuraria somente por arquivos regulares.
Se você quiser procurar *[xyz] arquivos regulares em qualquer profundidade, desde que o diretório pai direto não termine em xyz (assim, encontrar x , a/x , a/b/x , x/b/x , mas não x/x nem a/x/x ), com GNU find :
LC_ALL=C find . -regex '.*[^xyz]/[^/]*[xyz]' -type f
com zsh :
setopt extended_glob
printf '%s\n' **/*[xzy]~*[xyz]/[^/]#(D.)
POSIXly:
LC_ALL=C find . -name '*[xzy]' -type f -exec sh -c '
for f do
case ${f%/*} in
*[xzy]) ;;
*) printf '%s\n' "$f"
esac
done' sh {} +
Se você não quer olhar para dentro de *[xyz] , mesmo em subdiretórios, (isto é, se você não quer encontrar x/a/x ) então é só:
find . -name '*[xyz]' -prune -type f
-prune diz find para não descer no diretório (e retornar true).
Ou com zsh :
setopt extended_glob
printf '%s\n' (*[^xyz]/)#*[xyz](D.)