Obter lista de todos os arquivos por máscara no terminal

3

Eu quero encontrar todos os arquivos *.h , *.cpp em pastas com máscara definida, como */trunk/src* . Então, eu posso encontrar separadamente arquivos *.h e *.cpp :

find . -path "*/trunk/src/*.h"
find . -path "*/trunk/src/*.cpp" 

Qual é a melhor maneira de obter a lista de arquivos de ambos os tipos ( *.h e *.cpp )?

PS: gostaria de enviar a lista para grep .

    
por Loom 08.08.2013 / 14:53

2 respostas

8

Você pode usar -o para "ou":

find . -path '*/trunk/src/*.h' -o -path '*/trunk/src/*.cpp'

que é o mesmo que

find . -path '*/trunk/src/*' \( -name '*.h' -o -name '*.cpp' \)

Se você deseja executar o grep nesses arquivos:

find . \( -path '*/trunk/src/*.h' -o -path '*/trunk/src/*.cpp' \) -exec grep PATTERN {} +

ou

find . -path '*/trunk/src/*' \( -name '*.h' -o -name '*.cpp' \) -exec grep PATTERN {} +
    
por 08.08.2013 / 14:57
2

No bash, ative a opção globstar para que ** corresponde a qualquer nível de subdiretórios. Você pode fazer isso a partir do seu ~/.bashrc . Além disso, ative as opções extglob para ativar os padrões estendidos do ksh.

shopt -s globstar extglob

Então:

grep PATTERN **/trunk/src/**/*.@(h|cpp)

Cuidado com o fato de que versões bash até 4.2 seguem links simbólicos para diretórios quando você usa ** .

O Zsh torna isso mais fácil, você não precisa definir nenhuma opção e pode simplesmente digitar

grep PATTERN **/trunk/src/**/*.(h|cpp)

Se a linha de comando for muito longa e você estiver no Linux ou em outra plataforma com o GNU grep, será possível fazer grep recurse em vez do shell para salvar no comprimento da linha de comando.

grep -R --include='*.cpp' --include='*.h' PATTERN **/trunk/src
    
por 09.08.2013 / 03:00