Se você não quiser encontrar descida além de uma certa correspondência, use -prune
e não, por exemplo. -path
ou filtrando a saída de find
com grep -v
Para testar as coisas, crie um ambiente com alguns arquivos e subdiretórios extras, para que você possa verificar o find
para não exibir material indesejado:
mkdir -p tmp/2/abc/def
touch tmp/2/abc/def/file1
mkdir -p tmp/2/abc/9876/xyz
touch tmp/2/abc/9876/xyz/file2
tree tmp/
dá:
tmp
└── 2
└── abc
├── 9876
│ └── xyz
│ └── file2
└── def
└── file1
Se você usar find tmp/2/abc \! -path "*[0-9]*"
como sugerido por @terdon, a saída estará vazia, porque -path
não leva em conta apenas os diretórios que começam abaixo de abc
, mas o caminho completo, que inclui 2
. Então não é isso que você quer.
Se você usar find tmp/2/abc -type d | grep -vE '/[0-9-]+(/|$)'
, como sugerido pelo @cas, você verá que ele também não imprime nada, mais uma vez porque ele corresponde não apenas aos arquivos abaixo de onde você está pesquisando, mas também ao diretório denominado% código%. Além disso, isso exigiria que primeiro percorresse a árvore inteira sob 2
e se houvesse algumas centenas de milhares de itens, a caminhada (e a filtragem) levaria uma quantidade considerável de tempo.
Se você fizer isso:
find tmp/2/abc -type d -name '[!0-9]*' -print
você verá que a saída inclui o caminho 9876
. Para obter
livra-se daquilo que você não quer com tmp/2/abc/9876/xyz
:
find tmp/2/abc -type d -name '[!0-9]*' -print -o -name '[0-9]*' -prune
que dá:
tmp/2/abc
tmp/2/abc/def
você pode melhorar um pouco a eficiência disso trocando a poda e imprimindo, o que foi feito por @don_cristti em seu aprimoramento desta resposta.