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.)