find . -name excludeme -prune -o \
\( -name '*.c' -o -name '*.h' \) -print
Lembre-se de que AND (implícito) tem precedência sobre OR ( -o
). (veja também -name '*.[ch]'
)
Estou tentando usar o comando find para gerar uma lista de arquivos de origem em um diretório e apenas alguns de seus subdiretórios. Exemplo:
/Source_Files
/dontexclude
dontexclude.h
dontexclude.c
/exclude
exclude.c
exclude.h
main.c
test.c
test.h
Eu quero uma lista de arquivos terminados em '.c' e '.h', e quero excluir o conteúdo do subdiretório / exclude.
find -name '*.c' -o -name '*.h' -o -path '*/exclude' -prune
produz esta saída:
./test.h
./exclude
./test.c
./main.c
./dontexclude/dontexclude.c
./dontexclude/dontexclude.h
Como posso usar find
para produzir a lista acima sem "./exclude"?
Ao custo de algumas operações extras do sistema de arquivos, limite a pesquisa a arquivos simples. Isso excluirá o diretório exclude
porque não é um arquivo:
find . \( -name '*.c' -o -name '*.h' -o -path '*/exclude' -prune \) -type f
Este comando retorna o que você pergunta:
find . \( -name '*.c' -o -name '*.h' \) -a \! \( -path './exclude/*' \)
A mudança mais simples é substituir -prune
(não procure mais neste diretório), com -prune -false
(não procure mais neste diretório, e isto não é compatível).