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:
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.
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"