Comment puis-je trouver des fichiers qui ne contiennent pas un motif de chaîne donné?

Comment puis-je trouver le fichiers dans le répertoire courant qui n' pas contiennent le mot foo (à l'aide de grep)?

402
demandé sur nbro 2009-11-17 14:07:14

11 réponses

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

$ grep -L "foo" *
650
répondu ghostdog74 2015-03-04 17:39:03

Prendre un coup d'oeil à ack. Il fait automatiquement l'exclusion .svn pour vous, 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 recherchez doit être, dans ack:

ack -L foo
41
répondu Andy Lester 2018-03-07 14:13:56

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

find .  -not  -ipath '.*svn*' -exec  grep  -H -E -o -c  "foo"  {} \; | grep 0
12
répondu Senthil Kumar 2018-03-07 13:14:53

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

grep -rL "foo" ./* | grep -v "\.svn"
12
répondu user999305 2018-03-07 13:56:19

Vous aurez réellement besoin de:

find .  -not  -ipath '.*svn*' -exec  grep  -H -E -o -c  "foo"  {} \; | grep :0\$
6
répondu Forrest Tiffany 2018-03-07 13:57:33

J'ai eu de la chance avec

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

Mes tentatives avec grep -v m'a donné toutes les lignes sans "foo".

5
répondu Johnny 2018-03-07 13:56:37

Ouvrir le rapport de bogue

Comme commenté par @tukan, il y a un rapport de Bogue ouvert pour Ag concernant le -L/--files-without-matches drapeau:

Comme il y a peu de progrès dans le rapport de bogue, l'option -L mentionnée ci-dessous ne doit pas être invoquée sur, pas tant que le bogue n'a pas été résolu. Utilisez plutôt différentes approches présentées dans ce fil. Citant un commentaire pour le bug rapport [emphase mine]:

Des mises à jour à ce sujet? -L ignore complètement les correspondances sur la première ligne du fichier. On dirait que si cela ne va pas être corrigé bientôt, le drapeau devrait être entièrement supprimé, car il ne fonctionne pas du tout comme annoncé .


Le chercheur D'argent-Ag (fonction prévue - voir rapport de bogue)

, Comme une alternative efficace à la grep, vous pouvez utiliser le L'Argent Chercheur - Ag:

Un outil de recherche de code similaire à ack, avec un accent sur la vitesse.

En regardant man ag, nous trouvons l'option -L ou --files-without-matches:

...

OPTIONS
    ...

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

C'est-à-dire, à récursivement recherche de fichiers qui ne correspondent pas à foo, à partir du répertoire courant:

ag -L foo

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

ag -L foo --depth 0
2
répondu dfri 2018-09-19 13:28:44

Mon grep n'a pas d'option-L. Je trouve une solution de contournement pour y parvenir.

Les idées sont:

  1. pour vider tout le nom de fichier contenant la chaîne méritée dans un txt1.txt.
  2. videz 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 ">"
    
1
répondu user6305682 2016-05-08 03:37:47

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 sous find si vous devez également filtrer l'heure modifiée.

1
répondu zandeep 2016-11-10 19:31:55
grep -irnw "filepath" -ve "pattern"

Ou

grep -ve "pattern" < file

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

-3
répondu Jay 2014-04-30 18:43:26

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

cat file | grep -v "foo"
-3
répondu walkerlin 2018-03-07 13:58:35