Usando o `find` para várias extensões de arquivo

16

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

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

Como posso modificar os findparâmetros de comando 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.

Xavier
fonte
Esta questão é realmente sobre o findcomando, pois é aí que você está procurando por arquivos correspondentes.
iglvzx
1
Além disso, usar a find -print0 | xargs -0construção ou ainda melhor e mais simples: find . -name '*.cpp' -o -name '*.c' -o -name '*.h' -exec wc -l {} +. Isso evitará problemas de nome de arquivo (espaços em branco, novas linhas e assim por diante) e é (muito) bom costume.
Daniel Andersson

Respostas:

16

Use a -oopção para um OR. Por exemplo, isso iria listar .cpp, .ce .harquivos:

find . -name \*.cpp -o -name \*.c -o -name \*.h
JOTN
fonte
Ah O *não precisa mais ser escapado se formatado como código. Totalmente esquecido disso. :)
iglvzx
Sim, foram necessárias três edições por duas pessoas, mas conseguimos.
JOTN
2
Isso não funcionou para mim no OSX (correspondia apenas ao sobrenome * .ext) - tive que usar parênteses, conforme sugerido por @smokinguns abaixo.
Gileade
2

Você precisará usar a opção -o. Por exemplo, a instrução abaixo localiza 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 diferencie maiúsculas de minúsculas.

fumar
fonte
1
iname não está disponível em todas as versões do find.
JOTN
1

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

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

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

Vamos acabar com isso

  • find . localiza todos os arquivos recursivamente no caminho atual (mude para outro caminho, se necessário)
  • -type frestringe a pesquisa apenas a arquivos (não muito ganho de velocidade, mas ainda assim ...)
  • | grep -EEu usei isso para obter grep reconhecer ou ( |) operador no Mac OS X, que utiliza o FreeBSD grep , GNU grep não precisa que (cheque em seu manarquivo).
  • "\.java$|\.cpp$|\.c$"expressão regular que inclui arquivos cujas extremidades nome com .java, .cppe .c(os add que você precisa)

Você pode canalizar 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 CRLFlinha do DOS / Windows que termina no OS X / Linux LF(essa também é a sedsintaxe do OS X , verifique as especificações da sua versão).

MacMladen
fonte
Eu queria encontrar todos os tipos de arquivos de vídeo usando 25 parâmetros diferentes de correspondência de extensão. Essa foi a única abordagem que funcionou para mim. (Ubuntu 14.04 LTS)
Elder Geek