Baumbefehl für mehrere Einschlüsse und Ausschlüsse

33

Könnten Sie mir bitte ein Beispiel für die Verwendung des Befehls tree geben, um das Ergebnis wie folgt herauszufiltern:

  • Verzeichnisse zu ignorieren (sagen wir bin, unitTest)
  • nur die Auflistung bestimmter Dateien Erweiterungen mit (sagen wir .cpp, .c, .hpp, .h)
  • Angabe der vollständigen Pfadnamen nur der resultierenden Dateien, die den Kriterien entsprechen.
Linda
quelle

Antworten:

54

Eine Möglichkeit besteht darin, Muster mit den Schaltern -Iund zu verwenden -P:

tree -f -I "bin|unitTest" -P "*.[ch]|*.[ch]pp." your_dir/

Das -fdruckt den vollständigen Pfad für jede Datei und -Ischließt die Dateien in dem Muster aus, die hier durch einen vertikalen Strich getrennt sind. Der -PSchalter enthält nur die Dateien, die in dem Muster aufgeführt sind, das einer bestimmten Erweiterung entspricht.


quelle
6
Hinweis: Fügen Sie keine abschließenden Schrägstriche in Ihr -I-Flag ein, z . B. -I binnicht -I bin/.
ThorSummoner
Dies macht einen Fehlersed: illegal option -- I
François Romain
4

Mit dem Befehl use findund treeuse find können Sie Suchverzeichnisse pruneausschließen und tree -Pdas Muster durchsuchen.

Verwenden Sie die Bereinigungsoption, wenn Sie beispielsweise das miscVerzeichnis ausschließen möchten, fügen Sie -path ./misc -prune -oIhrem Suchbefehl einfach ein hinzu .

für zB. find . -path ./misc -prune -o -exec tree -P <pattern> {} \;oder Sie können verwenden-name "*.cpp" in find

zum ausschluss mehrerer verzeichnisse verwenden

find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o

harish.venkat
quelle
Für mich gibt das Beispiel mit find den Fehler "find: Erwartet einen Ausdruck nach '-o'"
WebComer 18.11.18
hast du gerade versucht find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -ooderfind . -path ./misc -prune -o -exec tree -P *.cpp {} \;
harish.venkat
2

Die wahre Lösung besteht darin, vollständige Pfade auszugeben, unerwünschte Pfade herauszufiltern und schließlich die Ausgaben zu korrigieren.

tree -df | egrep -v "\./(bin|unitTest)/.*" | sed -r 's%\./.*/%%g'

Wenn alle Dateien in der Ausgabe benötigt werden, entfernen Sie den Parameter "d".

Eine ausführliche Erklärung finden Sie unter: http://qaon.net/press/archives/572, wenn Sie Japanisch verstehen.

Afante
quelle
-f Flagge super nützlich!
Michael Dimmitt