Numero di file contenenti una determinata stringa


19

Come posso contare il numero di file (in una directory) che contiene una determinata stringa come input in bash / sh?

Risposte:


30

grep -l "string" * | wc -l cercherà "stringa" nel contenuto di tutti i file nella directory di lavoro e ti dirà quanti abbinati.


1
Questo non funzionerà se ci sono molti file nella directory, genererà l'errore "zsh: lista degli argomenti troppo lunga: grep". Qualche idea su come sbarazzarsi di questo?

1
@ user16142 grep la directory anziché i file: grep -lr "string" directory | wc -lse non si desidera la ricerca ricorsiva, è possibile utilizzare l'opzione find with maxdepth: si find directory -maxdepth 1 -type f -exec grep -l "string" {} + | wc -lnoti che questa seconda opzione è più lenta di grep.
Agargara,

9

grepIl parametro s -lprodurrà solo i nomi dei file corrispondenti $PATTERN, wcin seguito li potrà contare.

grep -l "$PATTERN" * | wc -l

grazie, ma mi chiedevo con uno schema nel file ... scusate la domanda ambigua

Se è così, prendi la risposta di Wolf.
wag

3
awk '/pattern_to_look_for/ {s+=1; nextfile;} END {print s}' *

Chiarimento: cerca il numero di file che hanno "pattern_to_look_for" nei loro contenuti e non nei loro nomi di file (come la risposta di Wag). Dalla tua domanda è difficile dire cosa stai cercando.


Ma manca qualcosa? perché non funziona

Se cerchi l'anatra stringa devi scriverla come / duck / in Awk. Lo stai facendo?
Jan Persson,

sì, l'output: awk: errore di lettura (è una directory)

La risposta di Wolf ti darà duplicati. Se ci sono più ricorrenze della stringa che stai cercando in uno dei file, verranno conteggiati come corrispondenze extra.
Jan Persson,

Bene, se hai delle directory nella cartella devi fare alcune cose extra come sostituire la stella con qualcosa del genere find . ! -name . -prune -type f(non perdere i backtick). Questo comando elenca solo i file nella cartella.
Jan Persson,

2

Questo funziona in Bash con qualsiasi nome di file:

grep -lZ "$pattern" * | tr -cd '\000' | wc -c

Spiegazione:

  • grepL' -Zopzione stampa ogni risultato con un separatore ␀ byte. Questo personaggio non può far parte del nome di un file, quindi possiamo semplicemente contare il numero di separatori per ottenere il numero di file.
  • Per eliminare gli altri caratteri nell'output, rimuoviamo semplicemente tutto tranne i except byte che usano tr.
  • Quindi conta solo i personaggi con wc.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.