Como posso encontrar todos os arquivos e diretórios correspondentes a um padrão, excluindo um diretório usando find
?
Digamos que eu tenha a seguinte estrutura de arquivo;
. foo-exclude-me / foo.txt foo-exclude-me-not / foo.txt Barra/ foo.txt foobar / bar.txt foofoo.txt
como obteria a seguinte saída usando find
:
./bar/foo.txt ./bar/foobar ./bar/foobar/foofoo.txt ./foo-exclude-me-not ./foo-exclude-me-not/foo.txt
Eu tentei usar o seguinte comando:
encontrar . -name 'foo-excluir-me' -prune -o -name 'foo *' encontrar . -name 'foo *' \! -path './foo-exclude-me/*'
mas os dois retornam isso:
./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me # << this should be excluded
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt
Como posso excluir corretamente o foo-exclude-me
diretório?
foo-exclude-me
vez de./foo-exclude-me
. Além disso, tente anexar-print
no final do comando.-print
e emfoo-exclude-me
vez de./foo-exclude-me
.Respostas:
Com não
-print
, a ação padrão implícita se aplica a todas as correspondências, mesmo as removidas. O explícito-print
se aplica somente às condições especificadas, que estão-name 'foo*'
apenas na ramificação else de-name 'foo-exclude-me'
.De um modo geral, use um explícito
-print
sempre que estiver fazendo algo mais complexo do que uma conjunção de predicados.Sua segunda tentativa com
! -path './foo-exclude-me/*'
não funcionou porque./foo-exclude-me
não corresponde./foo-exclude-me/*
(não à direita/
). Adicionar! -path ./foo-exclude-me
funcionaria.fonte
fonte
-prune
é relevante.-prune
é uma das opções mais complicadas parafind
'desabilitar-print
(que é ativado por padrão)'