Ich würde das nur eine Sekunde durchgehen grep
, um sie zu entfernen:
grep -r --exclude={\*~,\*.map} "OK" bar/ | grep -vP '(?<!debug)\.js'
Das -v
kehrt die Übereinstimmung um, druckt Linien, die nicht mit dem Muster übereinstimmen, und aktiviert-P
Perl-kompatible reguläre Ausdrücke, mit denen wir negative Lookbehinds verwenden können . Diese besondere regex wird übereinstimmen , .js
das ist nicht von prececeded debug
welche Mittel (da wir die Spiele sind invertiert) , die nur die .js
Dateien gedruckt werden.
Wie @QuestionOverflow in den Kommentaren hervorhob, könnte dies jedoch den unbeabsichtigten Nebeneffekt haben, Zeilen herauszufiltern , die enthalten OK
und js
da das grep -v
auf die gesamte Ausgabe angewendet wird, nicht nur den Dateinamen. Um dies zu vermeiden, fügen Sie einfach einen Doppelpunkt hinzu (dies wird grep
verwendet, um Dateinamen vom Dateiinhalt zu trennen):
grep -r --exclude={*~,*.map} "OK" bar/ | grep -vP '(?<!debug).js:'
Dies schlägt immer noch fehl, wenn Ihre Eingabezeile enthält foo.js:
oder wenn Ihr Dateiname enthält :
. Verwenden Sie also natürlich einen anderen Ansatz:
grep -Tr --exclude={*~,*.map} "OK" bar/ | grep -vP '(?<!debug).js\t'
Die -T
Ursachen grep
für das Drucken einer Registerkarte zwischen dem Dateinamen und dem Dateiinhalt. Wenn wir also einfach ein \t
am Ende der Regex hinzufügen , stimmt es nur mit den Dateinamen überein und nicht mit dem Inhalt der Zeile.
Trotzdem ist die Verwendungfind
möglicherweise sinnvoller.
OK
und.js
dieselbe Zeile enthalten?find
ist es wahrscheinlich besser für solche Dinge. Das Richtige zugrep
finden kann schwierig sein, wie Sie betont haben :).failglob
Option in der Shell festgelegt ist:bash: no match: --exclude=*~
Sie müssen Ihre GLOB-Musterargumente zitieren--exclude
, um sie vor der Shell-Erweiterung zu verbergen, z. B.--exclude={\*~,\*.map}
Ich würde verwenden
find
, um die Dateien zu finden und das Ergebnis durchzuleitenxargs
:Dies sucht nach jeder Datei, die nicht mit "
*~
", "*.map
" oder "*.js
aber nicht*.debug.js
" übereinstimmt .Mit können
find
Sie leicht nach recht komplexen Regeln suchen, und dieser Ansatz erspart Ihnen das versehentliche Entfernen von Fehlalarmen, wie dies bei double der Fall sein könntegrep
.quelle
-exec grep OK {} +
anstelle von verwendenxargs
und vermeiden.-exec +
nicht vorgeschlagen habe-exec \;
, dass so wenig Befehle wie möglich ausgeführt werden, ähnlich wiexargs
.Mit können
zsh
Sie tun:Vorausgesetzt natürlich, die Argumentliste ist nicht zu lang. In diesem Fall können Sie immer Folgendes tun:
quelle
zsh
autoload zargs
zargs some/dir/**/^(*~|*.map|(^*debug).js) -- grep OK
Wenn es Ihnen nichts ausmacht, die Ausgabe leicht in der falschen Reihenfolge zu sehen (wenn Sie dies tun, können Sie sie sortieren):
Dies setzt
**
voraus , dass Ihre Shell rekursives Globbing unterstützt: zsh ist sofort einsatzbereit, bash nach dem Ausführenshopt -s globstar
, ksh93 nach dem Ausführenset -o globstar
.Ohne
**
Unterstützung in der Shell können Sie zwei grep-Befehle verwenden:quelle
**
, aber mit dem zusätzlichen Argument scheint etwas nicht zu stimmen**/*.debug.js
, was dazu führt, dass grepOK
als Verzeichnis interpretiert wird . Haben Sie versucht, es auszuführen?Sie können verwenden
ripgrep
. Standardmäßig werden versteckte Dateien ignoriert und Ihre.gitignore
Datei respektiert .Sie können die Einschluss- oder Ausschlussregeln mithilfe der folgenden Parameter angeben:
Hier einige einfache Beispiele:
Dies ist die komplette Lösung auszuschließen
*.~
,*.map
,*.js
, aber nicht*.debug.js
:Testen:
quelle