2016-07-02 10 views
1

Ich möchte alle Dateien in einem Verzeichnis und seinen Unterverzeichnissen mit Ausnahme von Einstellungsdateien und alles in Einstellungen oder Abhängigkeitsverzeichnissen finden.Gibt es eine Möglichkeit, Ausnahmen für Ausschlüsse im Befehl find über Bash anzugeben?

Zum Beispiel möchte ich von meinen Ergebnissen ganze Verzeichnisse wie .git, .idea und node_modules sowie Dateien wie .DS_Store und config.codekit ausschließen, aber ich möchte .gitignore einschließen.

Was ich will, ist etwas wie die Ergebnisse des folgenden Git-Befehls, aber einschließlich aller nicht nachverfolgten Dateien und in der Lage, leicht und sicher bearbeitet zu werden (z. B. um Berechtigungen zu ändern). Hier

git ls-tree -r master --name-only 

ist, was ich habe, so weit und obwohl es ziemlich unhandlich ist, scheint es meistens zu tun, was ich will, außer für das Weglassen .gitignore:

find . -type f -not -name ".*" -not -name config.codekit -not -path "./.*" -not -path "./node_modules/*" 

Ich habe mit -prune experimentiert ohne viel Erfolg.

Gibt es eine Möglichkeit, Ausnahmen zu Ausschlüssen im Befehl find über Bash-zu sagen, etwas wie auszuschließen, alle Dinge, die dieses Muster übereinstimmen mit Ausnahme dieser Sache oder dieser Dinge?

Übrigens benutze ich derzeit OS X, aber ich benutze auch Ubuntu und ich plane, Ubuntu unter Windows zu versuchen, wenn das Windows 10 Anniversary Update allgemein verfügbar ist, also idealerweise möchte ich einen Befehl haben, der funktioniert alle von diesen.

Vielen Dank im Voraus für alle Lösungen, Erkenntnisse oder Optimierungen!

aktualisieren

Dank von gniourf-gniourf zu helfen, ich habe meinen Befehl überarbeitet. Dies scheint zu tun, was ich wollte:

find . -type f \(\! -name ".*" \! -name config.codekit \! -path "./.*" \! -path "./node_modules/*" -o -name .gitignore \) 

Antwort

1

Ein kurzes Beispiel zuerst: alle Dateien zu finden, Beschneiden die .git Verzeichnisse und ignorieren die .DS_Store Dateien:

find . -name .git -type d \! -prune -o \! -name .DS_Store -type f 

Für Beispiel, ich möchte von meinen Ergebnissen ganze Verzeichnisse wie .git, .idea und node_modules sowie Dateien wie ausschließen .DS_Store und config.codekit, aber ich möchte .gitignore einschließen.

find . \(-name .git -o -name .idea -o -name node_modules \) -type d \! -prune -o \! -name .DS_Store \! -name config.codekit -type f 

Wenn Ihr Befehl bauen, stellen Sie sicher, dass Sie mit den POSIX standard bleiben: es ist eine Garantie, dass Ihr Befehl auf jedem (POSIX-konform) System funktionieren wird. Beispiel: -not ist nicht POSIX-kompatibel: Verwenden Sie stattdessen ! (Sie müssen es umgehen, damit es nicht mit Ihrer Shell-Verlaufserweiterung kollidiert).


Gibt es eine Möglichkeit Ausnahmen Ausschlüsse in dem Suchbefehl über Bash-to angeben etwas sagen wie all die Dinge ausschließen, die dieses Muster außer dieser Sache oder diese Dinge passen?

Dateien suchen, ohne alles (Muster *) mit Ausnahme der Dateien one und two:

find . \(\! -name '*' -o -name one -o -name two \) -type f 
+0

Großen. Das ist alles hilfreich. Vielen Dank. Die Gruppierungs-, Ausschluss- und ODER-Operatoren können schwer zu befolgen sein. Mit all dem im Hinterkopf scheint dies zu tun, was ich will: 'finden. -type f \ (\! -name ". *" \! -name config.codekit \! -pfad "./.*" \! -path "./node_modules/*" -o -name .gitignore \) ' –

+0

Es sieht so aus, als ob ich diese Klammern in diesem Fall nicht brauche, also hier ist eine kleine Revision: 'finden. -Typ f \! -Name ".*" \! -name config.codekit \! -path "./.*" \! -path "./node_modules/*" -o -name .gitignore' –

+0

@BrianSexton: Wegen '-o' wird das' -type f'-Prädikat nicht auf das Prädikat '-name .gitignore' angewendet, also du passt auch '.gitignore' _directories_. –