Frage

Dies ist mein letztes Drehbuch

find -regex "^\..*[^(~$|\.o$|\.exe)]" | grep -v "\.svn" | grep -v ".tab." | grep  -v ".yy." | xargs svn add 2>/dev/null

Zum Testen möchte ich es nicht zu SVN hinzufügen, also benutze ich

find -regex "^\..*[^(~$|\.o$|\.exe)]" | grep -v "\.svn" | grep -v ".tab." | grep  -v ".yy."

Hinweis: Ich wollte Dateien ignorieren, die mit '.' (in Strom und Unterordnern), konnte aber nicht herausfinden, wie ich mich für .svn entschieden habe

Ich habe versucht, die zusätzlichen Greps zu entfernen, um einen Regex zu produzieren, aber für mein Leben konnte ich es nicht dazu bringen, .svn (oder. Datei) in aktuellen und Subordnern zu ignorieren, und ich konnte es nicht dazu bringen, .tab zu ignorieren. oder .yy.

Ein Problem ist, dass ich nicht verstehen konnte, wie ich machen sollte. (Ignorieren Sie, ob mit?) Arbeit. Ich bin mir sicher, dass ein Problem die Tatsache ist, die ich tue.* Das ignorieren meinen .tab. Regel und ich bin mir nicht sicher, wie ich mich umgehen soll.

War es hilfreich?

Lösung

Ihr Grundproblem ist, dass Sie denken, dass Sie dies tun können:

[^(~$|\.o$|\.exe)]

Du kannst nicht.

In einer Charakterklasse (das ist es, was Sie hier haben) können Sie einzelne Charaktere einfügen (oder ausschließen), aber Sie können dort keine Ausdrücke schreiben. Das obige ist äquivalent (was den Regex -Motor betrifft) zu:

[^()~$|.oex]

Ich bin unter Windows, also kann ich Ihnen keinen getesteten Befehl geben, und Ihr Beitrag lässt mich ein bisschen verwirrt, welche Dateien Sie tatsächlich möchten. Dies ist also ein Hinweis auf die richtige Richtung in Bezug auf Ihr Regex -Missverständnis.

Andere Tipps

Hinweis: Ich wollte Dateien ignorieren, die mit '.' (in Strom und Unterordnern), konnte aber nicht herausfinden, wie ich mich für .svn entschieden habe

Ein Problem ist, dass ich nicht verstehen konnte, wie ich machen sollte. (Ignorieren Sie, ob mit?) Arbeit. Ich bin mir sicher, dass ein Problem die Tatsache ist, die ich tue.* Das ignorieren meinen .tab. Regel und ich bin mir nicht sicher, wie ich mich umgehen soll.

Das -regex Test auf find wird auf den vollständigen Pfad angewendet, nicht nur auf den Dateinamen. Aus der Mannseite:

Um beispielsweise eine Datei namens './fubar3' zu entsprechen, können Sie den regulären Ausdruck verwenden.*Bar. ' oder '.*b.*3', aber nicht 'f.*r3'.

Die Antwort von Soulmerge bietet eine Möglichkeit, alle Ihre Bedingungen in die Find -Aussage zu bringen. Sie könnten es auch mit so etwas tun

find * -regex 'include-pattern' -a ! \( -regex 'exclude-pattern' [-o 'exclude-pattern2' ...] \)

Wenn Sie mehrere Muster kombinieren möchten, die ausgeschlossen werden sollen, sei es in Ihren Rohrgreps oder in Finds Regexes, verwenden Sie einfach ein oder:

grep -v '\.svn\|.tab.\|.yy.'
egrep -v '\.svn|.tab.|.yy.'

Beachten Sie, dass es eine sehr, sehr gute Idee ist, einzelne Zitate für Regex zu verwenden. Sie möchten nicht, dass ein $ eine variable Erweiterung versucht.

Bearbeiten: Diese Ausschlussmuster, die Sie vorschlagen, die Sie vorschlagen, müssen wirklich kein Regex sein. Sie können sie nur mit -name bekommen, der nur dem tatsächlichen Namen entspricht, nicht mit dem gesamten Weg.

find * -regex 'include-pattern' -a ! \( -name .svn -o -name "*tab*" \)

Du kannst sagen find bestimmte Ordner und deren Inhalt mit ignorieren -prune. Und Sie brauchen hier keinen regelmäßigen Ausdruck, die anderen Fundbefehle sind völlig ausreichend. Wenn Sie in der Lage sein möchten, Dateinamen mit Leerzeichen zu verarbeiten, würde ich weiter verwenden -print0. Wenn Sie zusammenfassen, sollte dies das tun, was Sie brauchen:

find . \( -name ".*" -prune \) -or \
    -name "*.exe" -or -name "*.o" -or -name "*~" \
    -print0 | xargs -0 svn add

Ich bin mir nicht 100% sicher, was Sie erreichen möchten, aber find -regex '^.*/[^.].*' Sollte funktionieren (entspricht dem Nicht-Punkt-Zeichen zu Beginn des Namens).

Grep unterstützt mehrere Muster. Z.B:

grep -v -e "\.svn" -e ".tab." -e ".yy."
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top