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
)?
11 réponses
Si votre grep a l'option -L
(ou --files-without-match
):
$ grep -L "foo" *
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
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
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"
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'a donné toutes les lignes sans "foo".
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
Mon grep n'a pas d'option-L. Je trouve une solution de contournement pour y parvenir.
Les idées sont:
- pour vider tout le nom de fichier contenant la chaîne méritée dans un txt1.txt.
- videz tout le nom de fichier dans le répertoire dans un txt2.txt.
-
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 sous find si vous devez également filtrer l'heure modifiée.
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é
La commande suivante pourrait vous aider à filtrer les lignes qui incluent la sous-chaîne "foo".
cat file | grep -v "foo"