Comment trouver des fichiers ne contenant pas de modèle de chaîne donné?

Comment puis-je trouver les fichiers dans le répertoire en cours qui ne contiennent pas le mot foo (en utilisant grep )?

Si votre grep a l’option -L (ou --files-without-match ):

 $ grep -L "foo" * 

Jetez un oeil à ack . Il .svn automatiquement .svn , vous donne des expressions régulières Perl, et est un simple téléchargement d’un seul programme Perl.

L’équivalent de ce que vous cherchez devrait être, dans ack :

 ack -L foo 

La commande suivante me donne tous les fichiers qui ne contiennent pas le motif foo :

 find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep 0 

La commande suivante exclut la nécessité pour find de filtrer les dossiers svn en utilisant un second grep .

 grep -rL "foo" ./* | grep -v "\.svn" 

Vous aurez réellement besoin de:

 find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep :0\$ 

J’ai eu de la chance avec

 grep -H -E -o -c "foo" */*/*.ext | grep ext:0 

Mes tentatives avec grep -v m’ont simplement donné toutes les lignes sans “foo”.

Mon grep n’a aucune option -L. Je trouve une solution pour y parvenir.

Les idées sont:

  1. pour vider tout le nom du fichier contenant la chaîne méritée dans un txt1.txt.
  2. vider tout le nom de fichier dans le répertoire dans un txt2.txt.
  3. Faites la différence entre le fichier de vidage 2 avec la commande diff.

     grep 'foo' *.log | cut -c1-14 | uniq > txt1.txt grep * *.log | cut -c1-14 | uniq > txt2.txt diff txt1.txt txt2.txt | grep ">" 

find *20161109* -mtime -2|grep -vwE "(TRIGGER)"

Vous pouvez spécifier le filtre sous “find” et la chaîne d’exclusion sous “grep -vwE”. Utilisez mtime under find si vous devez également filtrer l’heure modifiée.

Le chercheur d’argent – Ag

Comme alternative puissante à grep , vous pouvez utiliser The Silver Searcher – Ag :

Un outil de recherche de code similaire à ack, axé sur la vitesse.

En regardant man ag , on trouve l’option -L ou --files-without-matches :

 ... OPTIONS ... -L --files-without-matches Only print the names of files that don´t contain matches. 

Par exemple, pour rechercher de manière récursive des fichiers ne correspondant pas à foo , à partir du répertoire courant:

 ag -L foo 

Pour rechercher uniquement les fichiers qui ne correspondent pas à foo dans le répertoire actuel , spécifiez simplement --depth=0 pour la récursivité:

 ag -L foo --depth 0 
 grep -irnw "filepath" -ve "pattern" 

ou

 grep -ve "pattern" < file 

la commande ci-dessus nous donnera le résultat comme -v trouve l'inverse du motif recherché

La commande suivante pourrait vous aider à filtrer les lignes qui incluent la sous-chaîne “foo”.

 cat file | grep -v "foo"