Comment puis-je trouver les fichiers qui ne contiennent pas d'un modèle de chaîne?
Comment puis-je trouver le fichiers dans le répertoire courant qui ne pas contiennent le mot foo
(à l'aide de grep
)?
Vous devez vous connecter pour publier un commentaire.
Si votre grep a la
-L
(ou--files-without-match
) option:ack -L 'foo'
GREP_OPTIONS='--exclude-dir=.svn --exclude-dir=.git'
:^)ag -L 'foo'
-rL
au lieu de-L
pour correspondre à des sous-répertoiresgrep -L 'foo' ./*
Dans ce cas, les résultats de chemin d'expansion (expansion) ne sera jamais confondu avec les drapeaux. Aussi, il est plus facile de diviser le résultat, s'il est stocké dans une variable ou utilisé par le biais de la substitution de commande, depuis les noms de fichiers sont moins susceptibles de contenir "./" que des espaces ou des tirets.grep -L 'foo' -- *
La norme est que les commandes qui prennent longue options d'utilisation--
pour indiquer qu'il n'y a pas plus d'options après ce point.Prendre un coup d'oeil à
ack
. Il ne le.svn
exclusion automatiquement pour vous, vous donne les expressions régulières de Perl, et est un simple téléchargement d'un seul programme en Perl.L'équivalent de ce que vous recherchez doit être, dans
ack
:La commande suivante me donne tous les fichiers qui ne contiennent pas le modèle
foo
:grep '0$'
correspondent à des fichiers avec des multiples de 10 lignes trop! Vous avez besoingrep ':0$'
à la fin pour vérifier explicite ':0' à la fin de la ligne. Ensuite, vous obtiendrez uniquement des fichiers avec des lignes de zéro de correspondance.La commande suivante exclut la nécessité pour le trouver pour filtrer les
svn
dossiers à l'aide d'un deuxièmegrep
.Vous aurez réellement besoin:
J'ai eu de la chance avec
Mes tentatives avec
grep -v
m'a donné toutes les lignes sans "foo".Vous pouvez le faire avec grep seul (sans trouver).
C'est l'explication des paramètres utilisés sur
grep
Si vous utilisez
l
(lowercase), vous obtiendrez le contraire (fichiers avec des allumettes)Problème
J'ai besoin de revoir un grand projet qui utilise
.phtml
fichiers d'écrire du HTML à l'aide de PHP en ligne de code. Je veux utiliser Moustache modèles de la place. Je veux trouver tout.phtml
giles qui ne contiennent pas la chaînenew Mustache
toujours besoin d'être réécrit.Solution
find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'
Explication
Avant les tuyaux:
Trouver
find .
De trouver des fichiers de manière récursive, à partir de ce répertoire-iname '*.phtml'
Nom de fichier doit contenir.phtml
(lei
le rend insensible à la casse)-exec 'grep -H -E -o -c 'new Mustache' {}'
Exécuter legrep
commande sur chacun de la correspondance des cheminsGrep
-H
Toujours imprimer le nom de fichier les en-têtes de lignes de sortie.-E
Interpréter le motif comme une expression régulière étendue (c'est à dire de la force de grepà se comporter comme des egrep).
-o
Imprime uniquement la partie correspondant de l'lignes.-c
Seulement un nombre de lignes sélectionnées est écrit sur la sortie standard.Cela va me donner une liste de tous les chemins d'accès de fichier se terminant par
.phtml
, avec un décompte du nombre de fois que la chaînenew Mustache
se produit dans chacun d'eux.La première pipe
grep :0$
filtres de cette liste pour inclure uniquement les lignes se terminant par:0
:Le deuxième tube
sed 's/..$//'
des bandes des deux derniers caractères de chaque ligne, en laissant seulement les chemins d'accès de fichier.Mon grep ne dispose d'aucune option-L. Je n'ai trouver la solution pour y parvenir.
Les idées sont les suivants :
faire la différence entre les 2 fichier de vidage avec la commande diff.
diff
entre deux flux de sortie (je pense que vous entourez les commandes avec des parenthèses, et il y a un angle de pédalier, il y a aussi quelque part), si vos systèmes prend en charge, qui je suppose est la question, car il ne prend pas en chargegrep -L
find *20161109* -mtime -2|grep -vwE "(TRIGGER)"
Vous pouvez spécifier le filtre sous "rechercher" et l'exclusion de la chaîne de sous "grep -vwE". Utilisation mtime en vertu de la trouver si vous avez besoin de filtrer sur la date de modification trop.
Ouvrir le rapport de bug
Comme indiqué par @tukan, il y a un rapport de bug pour l'Ag concernant la
-L
/--files-without-matches
drapeau:--fichiers-sans-correspondances
ne fonctionne pas correctementComme il y a peu de progrès pour le rapport de bug, le
-L
option mentionnés ci-dessous ne doit pas être invoqué, pas tant que le bug n'a pas été résolu. Utiliser différentes approches présentées dans ce fil à la place. Citant un commentaire pour le rapport de bug [c'est moi qui souligne]:L'Argent Chercheur - Ag (fonction - voir le rapport de bug)
Comme une alternative efficace à la
grep
, vous pouvez utiliser le L'Argent Chercheur - Ag:Regardant
man ag
, nous trouvons la-L
ou--files-without-matches
option:I. e., pour de manière récursive de recherche pour les fichiers qui ne correspondent pas
foo
, à partir du répertoire courant:Pour rechercher seulement actuel répertoire pour les fichiers qui ne correspondent pas
foo
, il suffit de préciser--depth=0
de la récursion:-L
bug - github.com/ggreer/the_silver_searcher/issues/238ou
commande ci-dessus va nous donner le résultat sous -v trouve l'inverse du motif recherché
-l
option pour imprimer simplement le nom de fichier; mais il y a encore imprime les noms de fichier qui contient aucun de la ligne qui ne contient pas le motif. Je crois que l'OP veut trouver les fichiers qui ne contiennent pas de n'importe quelle ligne qui contient le motif.La commande suivante peut vous aider à filtrer les lignes qui comprennent la sous-chaîne "toto".
cat
.