Mac OS X-Äquivalent des Ubuntu-Befehls "Baum"

172686
Misha Moroshko

Gibt es ein Äquivalent zum Ubuntu- treeBefehl für Mac OS X?

273

13 Antworten auf die Frage

387
slhck

Sie können den treeBefehl auch auf macOS erhalten. Wenn Sie Homebrew haben, müssen Sie nur Folgendes ausführen:

brew install tree 

Lesen Sie weiter für Details.


Mit einem Paketmanager

Es gibt mehrere Paketmanager für macOS. Die beliebtesten sind: Homebrew, MacPorts oder Fink . Sie können beides installieren, aber ich empfehle Homebrew. Installieren Sie nicht mehr als eine davon gleichzeitig!

Folgen Sie den Anweisungen auf der Website und führen Sie dann einen der folgenden Befehle aus, je nachdem, welchen Paketmanager Sie ausgewählt haben.

Für Homebrew:

brew install tree 

Für MacPorts:

sudo port install tree 

Für Fink:

fink install tree 

Die Paketmanager bieten andere Befehlszeilenprogramme an, einschließlich der GNU / Linux-Programme, die standardmäßig nicht mit macOS geliefert werden.

Installation von der Quelle

Zunächst müssen Sie die Xcode-Befehlszeilentools installieren, indem Sie sie ausführen xcode-select --install.

Dann laden Sie die treeQuelle . Dann das Makefile ändern, damit es funktioniert zu bekommen, die auch in erklärt @ apuche Antwort unten . Das Auskommentieren der Linux-Optionen und das Auskommentieren der macOS-Optionen sollte ausreichen.

Dann renne ./configuredann make.

Jetzt müssen Sie die treeBinärdatei an einen Ort verschieben, der sich in Ihrem ausführbaren Pfad befindet. Zum Beispiel:

sudo mkdir -p /usr/local/bin sudo cp tree /usr/local/bin/tree 

Bearbeiten Sie nun Ihr ~/.bash_profilemit:

export PATH="/usr/local/bin:$PATH" 

Laden Sie die Shell neu und which treesollte jetzt auf zeigen /usr/local/bin/tree.

http://shaunchapmanblog.com/post/329270449/how-to-install-the-ree-command-on-mac-os-x scheint auch detaillierte Anweisungen zu haben, kann jedoch zu Problemen mit llvm-gcc führen, die unter / Developer leben, falls Sie führen Xcode 4.x aus. ein bisschen Fummeln sollte den Trick tun. Ahmed Masud vor 12 Jahren 0
@slhck: Danke! _Homebrew_ + `brew install tree` zu ​​installieren funktionierte wie ein Zauber :) Misha Moroshko vor 12 Jahren 9
@MishaMoroshko Froh, dass es funktioniert hat. Auf Homebrew finden Sie viele Programme. Wenn Sie jemals etwas vermissen, das Sie unter Ubuntu hatten oder gedacht haben, nur Linux könnte, könnte Homebrew Ihnen helfen! slhck vor 12 Jahren 0
"Problematisch" wie? David Moles vor 9 Jahren 0
@DavidMoles Weil das Ausführen von make unter OS X nicht funktioniert. Zuerst müssen Sie wissen, wie Sie die Xcode-Befehlszeilentools installieren (oder generell etwas über das Erstellen von Software wissen). Dann werden Sie feststellen, dass ein undefiniertes Symbol fehlerhaft ist. Sie müssen also einige Anpassungen am Makefile vornehmen (wie hier erklärt (http://andre-als.blogspot.de/2012/02/how-to-install-command-tree-for-mac.html)) . Zu viel Mühe, IMO. slhck vor 9 Jahren 1
+1 zur Verdeutlichung. :) (Die Makefile-Bearbeitung ist auch in dieser Antwort (http://superuser.com/a/448969/100451) unten dokumentiert. Übrigens.) David Moles vor 9 Jahren 0
1) Okay, Sie müssen die Xcode-Befehlszeilentools installieren, um Programme zu kompilieren, die Sie unter OS X aus dem Quellcode installieren möchten. Da es sich jedoch in der gesamten Diskussion um ein Befehlszeilentool, nämlich "Baum", handelt, würde ich vermuten dass die meisten Menschen das bereits getan haben oder dies sehr einfach tun können. Ich persönlich hasse Paket-Manager, also versuche ich, wenn immer ich kann, die Quelle zu installieren. Die Installation der Xcode Command Line Tools erfordert keinen größeren Aufwand als die Installation eines Paketmanagers. Schließlich schlagen die Leute vor, dass ein Paket-Manager benötigt wird, um ein einfaches kleines Programm wie ... 7stud vor 9 Jahren 0
"Baum" ist übertrieben. 2) In Yosemite 10.10.2 gibt make keinen Fehler aus - es gibt eine Warnung, die ich gerade ignoriert habe, und der Baumbefehl wurde einfach installiert. Der Quellcode kann jedoch leicht geändert werden, um die Warnung zu beseitigen. Siehe die Kommentare in der anderen Antwort. 3) Wenn Sie etwas herunterladen, das Sie installieren möchten, lesen Sie zuerst die README-Datei und anschließend die INSTALL-Datei. Die INSTALL-Datei für `tree` fordert Sie auf, bestimmte Zeilen im Makefile abhängig von dem verwendeten Betriebssystem zu kommentieren. Jemand machte sich viel Mühe, um das extrem einfach zu machen. Es ist sicherlich nicht problematisch. 7stud vor 9 Jahren 0
@ 7stud Viele Leute kennen einige Befehlszeilentools für sehr einfache CLI-Aufgaben, und sie wissen möglicherweise nicht, wie sie Software kompilieren. Die Leute haben manchmal Schwierigkeiten zu verstehen, was ". / Configure" und "make" genau tun und warum diese überhaupt benötigt werden. Oder sie wollen nicht damit umgehen. Oder lesen Sie alle Hilfedateien. Sie machen lieber etwas wie "apt-get install". Es ist in Ordnung, wenn Sie Installationen von der Quelle bevorzugen (und ich persönlich auch), aber Sie müssen akzeptieren, dass es Lösungen gibt, die von anderen oder sogar von der Mehrheit der normalen Computerbenutzer leichter wahrgenommen werden. slhck vor 9 Jahren 3
@ 7stud Ich habe meine Antwort geändert, um mehr Informationen für beide Installationsarten von 'tree' zu erhalten. slhck vor 9 Jahren 0
* Die Leute haben manchmal Schwierigkeiten zu verstehen, was ./configure und machen sie genau und warum diese überhaupt benötigt werden. * Ich installiere seit 15 Jahren Software aus dem Quellcode, und ich habe keine Ahnung, was `. / Configure` und` machen ' `tun Ich weiß nur, dass dies Schritte sind, die ich ausführen muss, um Software zu installieren. Ich lese blind die README- und INSTALL-Dateien und mache, was immer es sagt. 7stud vor 9 Jahren 1
Dies funktionierte, aber ich musste dies auch tun (http://stackoverflow.com/a/26647594/2736496), damit der Link wirksam wird. aliteralmind vor 8 Jahren 0
Können Sie den `tree`-Befehl erhalten, um bestimmte Dateitypen zu ignorieren, z. B.` * .json`? Dhruv Ghulati vor 8 Jahren 0
@DhruvGhulati Nicht das ich wüsste, aber du könntest es "umkehren". Wie `Baum | grep -v "json" oder ähnliches. slhck vor 8 Jahren 1
@DhruvGhulati `tree --help` listet alle Optionen auf, eine davon ist -P pattern, die nur die Dateien enthält, die dem Muster entsprechen, und eine andere ist -I pattern, die die Dateien enthält, die dem Muster entsprechen . Also sollte 'tree -I' * .json'` tun, was Sie wollen. (Übrigens: Ich weiß nicht, was die Mustersyntax ist, aber ich habe festgestellt, dass diese funktioniert: Lassen Sie die Anführungszeichen nicht weg.) Steve Powell vor 7 Jahren 0
27
太極者無極而生

Nicht genau das Gleiche, aber ein schneller Weg auf dem Mac ist:

find . 

und das ist es. Es listet alle Dateipfade im aktuellen Verzeichnis als Liste auf.

Bei Interesse an einem bestimmten Verzeichnis: find ./ raspacorp vor 8 Jahren 0
Wenn Sie nur an Dateien interessiert sind, suchen Sie. -type f` Jared Beck vor 7 Jahren 0
Ich war nur daran interessiert, einige Ebenen tiefer zu gehen, um die Verzeichnisstruktur zu zeigen. -type d -maxdepth 2` arbeitete für mich Matthew Lock vor 7 Jahren 0
Verwenden Sie `find *` besser, wenn Sie keine versteckten Dateien und Verzeichnisse sehen möchten. `tree` zeigt standardmäßig keine versteckten Dateien und Verzeichnisse an. asmaier vor 6 Jahren 0
19
nichochar

Sie sollten wahrscheinlich Homebrew verwenden . Wenn Sie tun:

brew install tree 
Ich wollte gleich antworten. Gute Show. alfonso vor 8 Jahren 0
Einfacher, aber wirkungsvoller Vorschlag. Vielen Dank. Gearon vor 7 Jahren 0
18
Ahmed Masud

Es gibt keinen formalen treeBefehl per se, aber Sie können dies tun:

Speichern Sie das folgende Skript in / usr / local / bin / tree

#!/bin/bash  SEDMAGIC='s;[^/]*/;|____;g;s;____|; |;g'  if [ "$#" -gt 0 ] ; then dirlist="$@" else dirlist="." fi  for x in $dirlist; do find "$x" -print | sed -e "$SEDMAGIC" done 

Ändern Sie die Berechtigungen, sodass Sie sie ausführen können:

chmod 755 /usr/local/bin/tree 

Natürlich müssen Sie möglicherweise Folgendes erstellen /usr/local/bin:

sudo mkdir -p /usr/local/bin/tree 
Es fehlen alle Optionen von "Baum", aber immer noch eine nette kleine Lösung. slhck vor 12 Jahren 0
@slhck hehe es war eine schnelle Hacklösung ... Ahmed Masud vor 12 Jahren 0
Vielleicht möchten Sie Ihre Variablen jedoch zitieren. slhck vor 12 Jahren 0
$ x sollte $ dirlist sein, sollte nicht zitiert werden ... wegen der speziellen Erweiterung von "$ @" Ahmed Masud vor 12 Jahren 0
@AhmedMasud Ich habe dies hier verwiesen: http://superuser.com/questions/532156/how-do-i-print-a-ree-with-files-in-bash-for-windows#comment643537_532156, wenn Sie dort antworten werde dir die markierte Antwort geben jcollum vor 11 Jahren 0
Haben Sie eine Idee, wie Sie die Verzeichnisse farblich farblich hervorheben? Oder verwenden Sie die Verzeichnisfarben wieder. Jen S. vor 10 Jahren 0
@JenS. Natürlich können Sie den Suchbefehl einfach ändern, um damit umzugehen Ahmed Masud vor 10 Jahren 1
Genie - ich liebe es. xaphod vor 9 Jahren 1
16
apouche

Or if your administrator won't let you install any of the brew, fink, port tools you can always build it from the source :

curl -O ftp://mama.indstate.edu/linux/tree/tree-1.5.3.tgz tar xzvf tree-1.5.3.tgz cd tree-1.5.3/ ls -al 

Edit the Makefile to comment linux part and uncomment osx area:

# Linux defaults: #CFLAGS=-ggdb -Wall -DLINUX -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 #CFLAGS=-O2 -Wall -fomit-frame-pointer -DLINUX -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 #LDFLAGS=-s # Uncomment for OS X: CC=cc CFLAGS=-O2 -Wall -fomit-frame-pointer -no-cpp-precomp LDFLAGS= XOBJS=strverscmp.o 

Optional: Forcing color output

And while you're at it, if you want to force tree to always colorize the output, you can always edit the main method of the tree.c file and add force_color=TRUE; before setLocale(LC_TYPE,"");

Finally hit make and you're done building tree for mac.

Tribute goes to Shaun Chapman for his original post on his blog.

Konnte nicht zu Shauns Website gelangen; Vielen Dank für die Hinweise, wie Sie das Makefile modifizieren. Paul Nathan vor 12 Jahren 0
Insbesondere können Sie `force_color = TRUE;` hinzufügen. Kein Semikolon und Sie erhalten einen Kompilierungsfehler. tgrosinger vor 11 Jahren 0
Ich habe gerade Version 1.7 gebaut und anstelle von setLocale `` setlocale`. In `tree.c` suchen Sie also nach` setlocale (LC_TYPE, "") `; und danke! Avi Cohen vor 10 Jahren 1
Gute Antwort. Können Sie eine Anmerkung hinzufügen, wie sie nach `/ bin` (oder einem Pfad, damit sie global verwendet werden kann) verschoben wird? Khanh Nguyen vor 10 Jahren 0
Zu Ihrer Information, 1.7.0 unter Yosemite kompilieren, bekam ich: `warning: format gibt den Typ 'long' an, aber das Argument hat den Typ 'long long'. Das Update bestand darin, einen Formatbezeichner von "% 9ld" in "% 9lld" zu ändern. David Moles vor 9 Jahren 0
@KhanhNguyen - Persönlich stelle ich solche Sachen in `~ / bin` und habe eine Zeile` export PATH = ~ / bin: $ PATH` in meinem `~ / .bash_profile`. David Moles vor 9 Jahren 0
@DavidMoles, gleiche Warnung hier. Ich ignorierte es und "sudo make install" schien zu funktionieren. Wo ist dieser Formatbezeichner? Es ist nicht im Makefile. Ah, ich habe es in `tree.c` gefunden. 7stud vor 9 Jahren 0
Es ist nicht setLocale, sondern setlocale (), also müssen Sie nach dem korrekten Begriff suchen. Die Installation von der Quelle ist der Weg zu gehen. Die `Install`-Datei sagt Ihnen, welche Zeilen in Ihrem Makefile abhängig von Ihrem Betriebssystem als Kommentar dekommentiert werden sollten. Es könnte also nicht einfacher sein (Sie müssen die Linux-Optionen nicht auskommentieren). Diese Antwort enthält jedoch zu viele Fehler. Das Kolorieren erscheint mir zufällig, also würde ich es einfach überspringen. 7stud vor 9 Jahren 0
5
jweyrich

Eine alternative Verwendung findund awk:

#!/bin/bash find . -print 2>/dev/null | awk '!/\.$/ { \ for (i=1; i<NF; i++) { \ printf("%4s", "|") \ } \ print "-- "$NF \ }' FS='/' 
3
vikas027

Hinzufügen eines kleinen Punkt zu @ apuche Antwort für OSX El Capitan wurzellos Funktion. make installschlägt fehl, da wir nicht in das /usr/binVerzeichnis schreiben dürfen .

vikas@MBP:~/Downloads/tree-1.7.0$ sudo make install Password: install -d /usr/bin install: chmod 755 /usr/bin: Operation not permitted install -d /usr/share/man/man1 if [ -e tree ]; then \ install tree /usr/bin/tree; \ fi install: /usr/bin/tree: Operation not permitted make: *** [install] Error 71 vikas@MBP:~/Downloads/tree-1.7.0$ 

Um dies zu überwinden, einfach zu bearbeiten Makefilehabenprefix = /usr/local

Nun, das funktioniert technisch. Aber es ist invasiv. Sie könnten wahrscheinlich `./configure --prefix = / usr / local` ausführen, bevor Sie` make` und `make install` ausführen, und es würden die gleichen Ergebnisse erzielt. JakeGould vor 8 Jahren 0
@JakeGould Absolut, ich verwende in solchen Szenarien "Präfix". In der neuesten Version von [tree] (http://mama.indstate.edu/users/ice/tree/) (1.7.0) befindet sich jedoch keine `configure'-Datei. Die `INSTALL`-Datei im entpackten Verzeichnis sagt einfach, dass Sie` make` und `make install` sofort verwenden sollen. vikas027 vor 8 Jahren 1
3
Shashank Agrawal

Ich habe hier eine einfache Lösung gefunden: http://murphymac.com/tree-command-for-mac/

Wenn Sie also zu Ihrem oder einem anderen Ort Folgendes hinzufügen .bashrc, .bash_profilewird es funktionieren:

alias tree="find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'" 

Das Hinzufügen eines treeBefehls wird jetzt wie folgt gedruckt:

# ~/my-html-app [13:03:45]$ tree . |____app.js |____css | |____main.css | |____theme.css |____index.html 
2
l --marc l

Ich habe ~ / .bash_profile zur Verwendung in Terminal.app hinzugefügt. Einige Kommentare sollen helfen, sich daran zu erinnern, wie die Suchfunktion verwendet wird.

########## ## tree ## ########## ## example ... #|____Cycles #| |____.DS_Store #| |____CyclesCards.json #| |____Carbon #| | |____Carbon.json # alternate: alias tree='find . -print | sed -e "s;[^/]*/;|____;g;s;____|; |;g"' # use$ tree ; tree . ; tree [some-folder-path] function tree { find $ -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g' } 

Beispiel für das aktuelle Verzeichnis

$> tree 

Beispiel für einen Pfad

$> tree /some/path 
2
Phrogz

Hier ist eine Ruby-Skriptlösung, die einen schönen Unicode-Baum zusammen mit nützlichen Metadaten erzeugt.

#!/usr/bin/env ruby def tree_hierarchy( root, &children ) queue = [[root,"",true]] [].tap do |results| until queue.empty? item,indent,last = queue.pop kids = children[item] extra = indent.empty? ? '' : last ? '└╴' : '├╴' results << [ indent+extra, item ] results << [ indent, nil ] if last and kids.empty? indent += last ? ' ' : '│ ' parts = kids.map{ |k| [k,indent,false] }.reverse parts.first[2] = true unless parts.empty? queue.concat parts end end end def tree(dir) cols = tree_hierarchy(File.expand_path(dir)) do |d| File.directory?(d) ? Dir.chdir(d){ Dir['*'].map(&File.method(:expand_path)) } : [] end.map do |indent,path| if path file = File.basename(path) + File.directory?(path) ? '/' : '' meta = `ls -lhd "#"`.split(/\s+/) [ [indent,file].join, meta[0], meta[4], "%s %-2s %s" % meta[5..7] ] else [indent] end end maxs = cols.first.zip(*(cols[1..-1])).map{ |c| c.compact.map(&:length).max } tmpl = maxs.map.with_index{ |n,i| "%#{'-' if cols[0][i][/^\D/]}#s" }.join(' ') cols.map{ |a| a.length==1 ? a.first : tmpl % a } end puts tree(ARGV.first || ".") if __FILE__==$0 

Sie können die meta = …Zeile ändern, um verschiedene Metadaten zu extrahieren, die angezeigt werden sollen, indem Sie die aufgeteilten Teile in der nächsten Zeile von Hand auswählen. Mit etwas mehr Arbeit können Sie beliebige ls-Argumente übergeben, um die anzuzeigenden Metadaten auszuwählen.

Beispielausgabe (sieht im OS X-Terminal besser aus als die Schrift in Stack Overflow):

phrogz$ tree UCC_IVI/ UCC_IVI/ drwxr-xr-x 510B Nov 20 11:07 ├╴docs/ drwxr-xr-x 102B Nov 20 19:21 │ └╴CANMessages.txt -rwxr-xr-x 2.2K Nov 20 19:21 │  ├╴effects/ drwxr-xr-x 204B Nov 19 17:19 │ ├╴Depth Of Field HQ Blur.effect -rwxr-xr-x 2.4K Nov 19 17:19 │ ├╴FXAA.effect -rwxr-xr-x 1.6K Nov 17 15:38 │ ├╴HDRBloomTonemap.effect -rwxr-xr-x 11K Nov 17 15:38 │ └╴SMAA1X.effect -rwxr-xr-x 4.4K Nov 19 17:19 │  ├╴fonts/ drwxr-xr-x 136B Nov 17 15:38 │ ├╴Arimo-Regular.ttf -rwxr-xr-x 43K Nov 17 15:38 │ └╴OFL.txt -rwxr-xr-x 4.3K Nov 17 15:38 │  ├╴maps/ drwxr-xr-x 238B Nov 19 17:19 │ ├╴alpha-maps/ drwxr-xr-x 136B Nov 17 15:38 │ │ ├╴rounded-boxes-3.png -rwxr-xr-x 3.6K Nov 17 15:38 │ │ └╴splatter-1.png -rwxr-xr-x 35K Nov 17 15:38 │ │  │ ├╴effects/ drwxr-xr-x 136B Nov 19 17:19 │ │ ├╴AreaTex-yflipped.dds -rwxr-xr-x 175K Nov 19 17:19 │ │ └╴SearchTex-yflipped.png -rwxr-xr-x 180B Nov 19 17:19 │ │  │ ├╴IBL/ drwxr-xr-x 136B Nov 17 15:38 │ │ ├╴028-hangar.hdr -rwxr-xr-x 1.5M Nov 17 15:38 │ │ └╴FieldAirport.hdr -rwxr-xr-x 1.5M Nov 17 15:38 │ │  │ ├╴icons/ drwxr-xr-x 238B Nov 19 17:19 │ │ ├╴icon_climate.dds -rwxr-xr-x 683K Nov 19 17:19 │ │ ├╴icon_music.dds -rwxr-xr-x 683K Nov 19 17:19 │ │ ├╴icon_navigation.dds -rwxr-xr-x 683K Nov 19 17:19 │ │ ├╴icon_phone.dds -rwxr-xr-x 683K Nov 19 17:19 │ │ └╴icon_surroundView.dds -rwxr-xr-x 683K Nov 19 17:19 │ │  │ └╴materials/ drwxr-xr-x 102B Nov 19 17:19 │ └╴spherical_checker.png -rwxr-xr-x 11K Nov 19 17:19 │  ├╴materials/ drwxr-xr-x 102B Nov 19 17:19 │ └╴thin_glass_refractive.material -rwxr-xr-x 6.0K Nov 19 17:19 │  ├╴models/ drwxr-xr-x 136B Nov 19 17:19 │ ├╴BokehParticle/ drwxr-xr-x 136B Nov 19 17:19 │ │ ├╴BokehParticle.import -rwxr-xr-x 739B Nov 19 17:19 │ │ └╴meshes/ drwxr-xr-x 102B Nov 19 17:19 │ │ └╴Mesh.mesh -rwxr-xr-x 1.1K Nov 19 17:19 │ │  │ └╴Glass_Button/ drwxr-xr-x 136B Nov 19 17:19 │ ├╴Glass_Button.import -rwxr-xr-x 1.2K Nov 19 17:19 │ └╴meshes/ drwxr-xr-x 136B Nov 19 17:19 │ ├╴GlassButton.mesh -rwxr-xr-x 44K Nov 19 17:19 │ └╴Icon.mesh -rwxr-xr-x 1.8K Nov 19 17:19 │  ├╴scripts/ drwxr-xr-x 204B Nov 19 17:19 │ ├╴App.lua -rwxr-xr-x 764B Nov 17 15:38 │ ├╴CANSim.lua -rwxr-xr-x 29K Nov 17 15:38 │ ├╴ObjectWiggler.lua -rwxr-xr-x 3.7K Nov 19 17:19 │ └╴PathWiggler.lua -rwxr-xr-x 2.9K Nov 17 15:38 │  ├╴states/ drwxr-xr-x 170B Nov 19 18:45 │ ├╴app-camera.scxml -rwxr-xr-x 2.4K Nov 20 11:07 │ ├╴app-navigation.scxml -rwxr-xr-x 590B Nov 19 18:32 │ └╴logic.scxml -rwxr-xr-x 4.2K Nov 19 18:59 │  ├╴tests/ drwxr-xr-x 102B Nov 17 15:38 │ └╴interface-navigation.scxml-test -rwxr-xr-x 83B Nov 17 15:38 │  ├╴UCC_IVI.uia -rwxr-xr-x 630B Nov 19 17:32 ├╴UCC_IVI.uia-user -rwxr-xr-x 832B Nov 20 17:22 ├╴UCC_IVI.uip -rwxr-xr-x 1.5K Nov 17 15:38 └╴UCC_Menu.uip -rwxr-xr-x 33K Nov 19 17:19 
Vielen Dank für die leichte Lösung! Unter OSX 10.9.5 (laufendes Lager Ruby 2.0.0) musste ich aufgrund einer Fehlermeldung "keine implizite Konvertierung von true in String (TypeError)" die sechste Zeile der # baum-Methode ändern, um file = File.basename zu lesen (Pfad) + (File.directory?(path)? '/': '') joel.neely vor 8 Jahren 2