2016-08-09 158 views
2

Ich versuche, Dateien mit find util zu finden, und ich möchte alle *.js-Dateien außer Dateien in den speziellen Verzeichnissen finden. Ich versuche, mit dem Befehl zu finden:Regex zum Ausschließen von Wörtern für Werkzeug finden

find ./ -regex '\.((?\!node_modules).)*\.js' 

Aber dieses Szenario findet nichts.

Dieser Regex funktioniert für Sublime Text 3, wo ich es getestet habe.

P.S. Ich weiß über das Lösen mit anderen Optionen wie unten. Aber ich möchte wissen, wie das Problem mit regex lösen

find ./ -path *node_modules -prune -o -name *.js 
+0

Versuchen Sie Folgendes: 'finden. -name "* .js" | grep -v "" | grep -v "dir2" ... '(" grep -v "bedeutet" nicht enthalten ... ") – Dominique

Antwort

2

Sie können es im Moment nicht.

GNU Find unterstützt mehrere Regex-Typen, aber keiner von ihnen unterstützt Zero Weiten Assertions.

-regextype type 
      Changes the regular expression syntax understood by -regex and -iregex tests which occur later on the command line. Currently-implemented types are emacs (this is the default), > posix-awk, posix-basic, posix- 
      egrep and posix-extended. 

Für Ihre Aufgabe benötigen Sie die Behauptung Lookbehind, und es wird noch nicht unterstützt.

Eine weitere Option für Sie ist die Verwendung find2perl, die einen Suchausdruck in ein Perl-Programm konvertiert, , die das Gleiche macht, was der Ausdruck macht.

Sie können dieses Programm verwenden, um zu überprüfen, ob Ihr Ausdruck mit PCRE und Look-Ahead/Look-Behind-Assertionen funktioniert.

1

Es scheint, dass die Regex-Engine Ihrer find Implementierung Lookaround nicht unterstützt. (Siehe in man find, und Sie werden wahrscheinlich feststellen, was @IgorChubin erklärt.)

Sie noch ! -regex verwenden können unerwünschte Muster ausschließen, zum Beispiel:

find . ! -regex '\./node_modules/.*' -name '*.js' 
+0

Danke, es funktioniert (mit dem Ausrufezeichen für Bash zu entkommen). Bui, es ist nicht die genaue Antwort auf meine Frage, weil es die andere Option ("!") Von 'find' verwendet, nicht nur regex – Pasha

+0

Sie müssen nicht' '' 'für Bash zu entkommen. Und außerdem könntest du * ein anderes '-Reex' anstelle von' -name' als 'finden. ! -regex '\ ./ node_modules /.*' -regex '. * \. js'' aber das ist unnötig länger, also würde ich nicht empfehlen – janos