Nombre de fichiers contenant une chaîne donnée

19

Comment puis-je compter le nombre de fichiers (dans un répertoire) contenant une chaîne donnée en entrée dans bash / sh?

Étoile de mer
la source

Réponses:

30

grep -l "string" * | wc -l recherchera "chaîne" dans le contenu de tous les fichiers du répertoire de travail et vous indiquera le nombre correspondant.

Loup
la source
1
Cela ne fonctionnera pas s'il y a beaucoup de fichiers dans le répertoire, cela générera l'erreur "zsh: liste d'arguments trop longue: grep". Des idées sur la façon de s'en débarrasser?
1
@ user16142 grep le répertoire au lieu des fichiers: grep -lr "string" directory | wc -lSi vous ne voulez pas de recherche récursive, vous pouvez utiliser l'option find avec maxdepth: find directory -maxdepth 1 -type f -exec grep -l "string" {} + | wc -lNotez que cette deuxième option est plus lente que grep.
Agargara
9

grepLe paramètre s -lne sortira que les noms de fichiers qui correspondent $PATTERN, wcpeut les compter ensuite.

grep -l "$PATTERN" * | wc -l
remuer
la source
merci, mais je me demandais avec un motif dans le fichier ... désolé pour la question ambiguë
Si oui, prenez la réponse de Wolf.
wag
3
awk '/pattern_to_look_for/ {s+=1; nextfile;} END {print s}' *

Clarification: Ceci recherche le nombre de fichiers qui ont le "pattern_to_look_for" dans leur contenu et non dans leurs noms de fichiers (comme la réponse de Wag). À partir de votre question, il est difficile de dire ce que vous recherchez.

Jan Persson
la source
Mais quelque chose manque? car cela ne fonctionne pas
Si vous recherchez la chaîne duck, vous devez l'écrire comme / duck / dans Awk. Tu fais ça?
Jan Persson
oui, la sortie: awk: erreur de lecture (est un répertoire)
La réponse de Wolf vous donnera des doublons. S'il y a plusieurs occurrences de la chaîne que vous recherchez dans l'un des fichiers, elle comptera comme correspondances supplémentaires.
Jan Persson
Eh bien, si vous avez des répertoires dans le dossier, vous devez faire des choses supplémentaires comme remplacer l'étoile par quelque chose comme ça find . ! -name . -prune -type f(ne manquez pas les astuces). Cette commande répertorie uniquement les fichiers du dossier.
Jan Persson
2

Cela fonctionne dans Bash avec n'importe quel nom de fichier:

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

Explication:

  • grepL' -Zoption de imprime chaque résultat avec un séparateur de ␀ octets. Ce caractère ne peut pas faire partie d'un nom de fichier, nous pouvons donc simplement compter le nombre de séparateurs pour obtenir le nombre de fichiers.
  • Pour se débarrasser des autres caractères dans la sortie, nous supprimons simplement tout sauf les ␀ octets en utilisant tr.
  • Comptez ensuite les caractères avec wc.
l0b0
la source