Removendo nomes de diretórios removidos da saída do comando find

3

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"?

    
por Timothy Schmitz 01.08.2017 / 23:18

4 respostas

5
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]' )

    
por 01.08.2017 / 23:31
0

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
    
por 01.08.2017 / 23:31
0

Este comando retorna o que você pergunta:

find . \( -name '*.c' -o -name '*.h' \) -a \! \( -path './exclude/*' \)

    
por 01.08.2017 / 23:33
0

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

    
por 02.08.2017 / 01:11

Tags