Nombre de files ne contenant pas de string donnée

J'ai lu la question sur la façon de find le nombre de files qui contiennent une certaine string. Ceci est possible avec grep -l "ssortingng" * | wc -l grep -l "ssortingng" * | wc -l .

Est-il possible d'inverser cela, find le nombre de files ne contenant pas la string cible? J'ai essayé d'append l'option -v , mais cela ne semble pas produire le bon résultat.

Avec GNU ou OpenBSD grep :

 grep -L "ssortingng" ./* | grep -c / 

Une autre méthode POSIX:

 c=0 for f in *; do [ -d "$f" ] && continue { grep -q ssortingng || c=$(($c + 1)); } < "$f" done echo "$c" 

En redirigeant le groupe de commands au lieu de grep seul, nous évitons de countr comme 1 les files que nous ne pouvons pas ouvrir (comme les files pour lesquels nous n'avons pas d'autorisation de lecture ou * s'il n'y a pas de file non caché dans le directory courant).

Avec GNU grep , l'équivalent serait:

 grep -d skip -L foo ./* | grep -c / 

Notez que vous ne pouvez pas utiliser wc -l car les noms de files peuvent être composés de plusieurs lignes. Avoir ./ évite également les problèmes avec les noms de files qui commencent par - ou sont - (qui -- ne fonctionne pas). Notez qu'il ignore les files de points.

Voici une façon compatible POSIX, au cas où vous n'avez pas grep -L :

 for file in *; do awk '/ssortingng/ { found=1; exit } END{ if(!found) { printf "x" } }' < "$file" done | wc -c 

Une autre méthode POSIX utilisant uniquement grep et wc :

 COUNT_FILES=0 for i in *;do COUNT_FILES=$((COUNT_FILES+1));done MATCHES=$(grep -l "ssortingng" * | wc -l) NON_MATCHES=$((COUNT_FILES - MATCHES)) echo "There are $NON_MATCHES files not matching \"ssortingng\"" 

Selon le nombre de files que vous voulez searchr, il est conseillé de consulter ack-grep . La raison, car ack-grep est beaucoup plus rapide que good'ol grep et la CLI est presque identique.

ack-grep -Lur "some ssortingng" * | wc -l

Avec zsh :

 ( arr=(./*(.N^e_'grep -q PATTERN $REPLY'_)); print ${#arr}; ) 

Cela enregistre les noms des files qui ne contiennent pas PATTERN dans un tableau et renvoie le nombre d'éléments dans le tableau. Il utilise des qualificateurs globaux:. ne sélectionne que les files normaux (ajoutez D pour inclure les files cachés), N active la command null glob et la string ^e_'grep -q PATTERN $REPLY'_ ( e ): ^e_'grep -q PATTERN $REPLY'_ désélectionne les noms de files pour lesquels le code shell les citations returnnent true .