Como localizar e contar quantos arquivos contêm uma determinada palavra?

7

Eu devo encontrar e exibir a contagem do número de arquivos que contêm a palavra cenoura (caso ignorado)

Até agora, isso é o que eu tenho, só não sei como adicionar o wc nele para contar quantos arquivos existem com a palavra cenoura

find . -exec grep -i carrot {} \;

    
por John 13.10.2013 / 01:02

3 respostas

13

Em primeiro lugar, como outros já disseram, não há razão para usar find , apenas use% recursivagrep:

grep -irm 1 carrot . | wc -l 

O -m 1 garante que grep pare de pesquisar cada arquivo após a primeira correspondência. Sem isso, você não está contando o número de arquivos que contêm carrot , mas o número de linhas , o mesmo arquivo será contado várias vezes se contiver várias instâncias de %código%. De carrot :

    -r, --recursive
          Read all files  under  each  directory,  recursively,  following
          symbolic  links  only  if they are on the command line.  This is
          equivalent to the -d recurse option.
   -i, --ignore-case
          Ignore  case  distinctions  in  both  the  PATTERN and the input
          files.  (-i is specified by POSIX.)
   -m NUM, --max-count=NUM
          Stop reading a file after NUM matching lines. 

Se você realmente quer fazer isso com o find, você pode fazer

find . -type f -exec grep -im 1 carrot {} \; | wc -l

Observe que estou especificando man grep , já que você não deseja -type f de diretórios.

    
por 13.10.2013 / 01:30
4

Encontre o número de arquivos que contêm a palavra cenoura

number_of_files='grep -l -r -i "carrot" . | wc -l'

Significado para os argumentos grep :

-l, --files-with-matches
         Only the names of files containing selected lines are written to standard output.  grep will only search a file until a match has been found, making
         searches potentially less expensive.  Pathnames are listed once per file searched.  If the standard input is searched, the string ''(standard
         input)'' is written.

-R, -r, --recursive
         Recursively search subdirectories listed.

-i : case insenstive

wc -l : imprime o número de linhas passadas como entrada para o programa. No nosso caso, essas linhas são os nomes dos arquivos com padrão de entrada correspondente encontrados por grep .

Imprimir a saída

echo $number_of_files
    
por 13.10.2013 / 01:15
3

Uma variante da solução do smRaj seria uma dupla invocação do grep. O seguinte daria o mesmo resultado que o grep [<>> ] | wc -l :

grep -l -r -i "carrot" . | grep -c .

O seguinte imprimiria uma lista numerada dos arquivos contendo a palavra pesquisada.

grep -l -r -i "carrot" . | grep -n .
    
por 13.10.2013 / 06:02