Usando 'find' para várias extensões de arquivo

14

Estou usando o seguinte comando para contar as linhas de texto em arquivos JAVA:

find . -name '*.java' | xargs wc -l

Como posso modificar os parâmetros do comando find para corresponder a mais de uma extensão de arquivo? Por exemplo, eu gostaria de usar a operação acima para arquivos CPP, C e H.

    
por Xavier 25.04.2012 / 00:24

4 respostas

14

Use a opção -o para um OR. Por exemplo, isso listaria os arquivos .cpp , .c e .h :

find . -name \*.cpp -o -name \*.c -o -name \*.h
    
por 25.04.2012 / 02:24
2

Você precisará usar a opção -o. Por exemplo, a declaração abaixo encontra todos os arquivos png, jpg e gif em uma pasta.

find . \( -iname \*.png -o -iname \*.jpg -o -iname \*.gif \)

Eu uso a opção -iname para que a correspondência não seja sensível a maiúsculas e minúsculas.

    
por 25.04.2012 / 02:52
1
$ find /path/ -name '*.cpp' -or -name '*.c' -or -name '*.h'

O "-or" diz que estou procurando um dos dois conjuntos.

Recentemente, escrevi um guia rápido sobre como usar o find com operadoras booleanas aqui: link

    
por 25.04.2012 / 02:58
1

Embora todas as respostas sejam mais ou menos as mesmas, não as acho legíveis com vários nomes e operadores booleanos intermediários.

Acho que isso pode ser uma solução mais elegante:

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$"

Vamos dividir isso

  • find . encontra todos os arquivos recursivamente no caminho atual (mude para algum outro caminho se você precisar)
  • -type f restringe a pesquisa apenas a arquivos (não muito de ganho de velocidade, mas ainda assim ...)
  • | grep -E usei isto para obter o operador grep reconhecer ou ( | ) no Mac OS X que usa o FreeBSD grep , o GNU grep não precisa disso (verifique no seu arquivo man ).
  • "\.java$|\.cpp$|\.c$" expressão regular que inclui arquivos cujo nome termina com .java , .cpp e .c (adicione os que você precisa)

Você pode enviar a lista resultante para processamento adicional, por exemplo,

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$" | xargs sed -i '' $'/s/\r$//'

Este exemplo remove a linha DOS / Windows CRLF que termina com OS X / Linux LF (também é a sintaxe do OS X sed , verifique as especificações da versão).

    
por 16.09.2016 / 23:02

Tags