Mac OS X-Äquivalent zum Ubuntu-"Baum"-Befehl
Gibt es ein Äquivalent zum Ubuntu-Befehl tree
-Befehl für Mac OS X?
Gibt es ein Äquivalent zum Ubuntu-Befehl tree
-Befehl für Mac OS X?
Sie können den Befehl tree
auch unter MacOS erhalten. Wenn Sie Homebrew haben, brauchen Sie nur:
brew install tree
Lesen Sie weiter für Details.
Es gibt mehrere Paketmanager für macOS. Die beliebtesten sind: Homebrew , MacPorts , oder Fink . Sie können einen der beiden installieren, aber ich empfehle Homebrew. Installieren Sie nicht mehr als eines davon gleichzeitig!
Folgen Sie den Anweisungen auf der Website und führen Sie dann einen der folgenden Befehle aus, je nachdem, welchen Paketmanager Sie gewä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 Kommandozeilenprogramme an, einschließlich der GNU/Linux-Programme, die standardmäßig nicht mit MacOS ausgeliefert werden.
Zuerst müssen Sie die Xcode-Befehlszeilenprogramme installieren, indem Sie xcode-select --install
ausführen.
Dann, laden Sie den tree
-Quellcode herunter . Dann ändern Sie das Makefile, um es zum Laufen zu bringen , was auch in @apuche’s Antwort unten erklärt wird. Es sollte ausreichen, die Linux-Optionen auszukommentieren und die MacOS-Optionen auszukommentieren.
Dann führen Sie ./configure
aus, dann make
.
Jetzt müssen Sie die Binärdatei tree
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 Ihre ~/.bash_profile
so, dass sie Folgendes enthält:
export PATH="/usr/local/bin:$PATH"
Laden Sie die Shell neu, und nun sollte which tree
auf /usr/local/bin/tree
zeigen.
Nicht ganz dasselbe, aber ein schneller Weg auf dem Mac ist:
find .
und das war’s. Er listet alle Dateipfade im aktuellen Verzeichnis als Liste auf.
Oder wenn Ihr Administrator Ihnen nicht erlaubt, eines der Tools brew
, fink
, port
zu installieren, können Sie es immer aus dem Quellcode erstellen:
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
Bearbeiten Sie das Makefile, um den Linux-Teil und den nicht kommentierten osx-Bereich zu kommentieren:
# 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
Und wenn Sie schon dabei sind, wenn Sie Tree zwingen wollen, die Ausgabe immer farbig zu gestalten, können Sie jederzeit die Methode main
der Datei tree.c
bearbeiten und force_color=TRUE;
vor setLocale(LC_TYPE,"");
Schließlich drücken Sie make
und Sie sind fertig mit der Erstellung von tree
für Mac.
Tribute goes to Shaun Chapman für seinen ursprünglichen Beitrag in seinem Blog.
Es gibt keinen formalen tree
-Befehl an sich, 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 so, dass Sie es ausführen können:
Natürlich müssen Sie möglicherweise /usr/local/bin
erstellen:
chmod 755 /usr/local/bin/tree
Ich habe hier eine einfache Lösung gefunden: http://murphymac.com/tree-command-for-mac/
Durch Hinzufügen des folgenden Befehls zu Ihrer .bashrc
, .bash_profile
oder einer anderen Stelle wird es also funktionieren:
alias tree="find . -print | sed -e 's;[^/]*/;| ____;g;s;____ |; |;g'"
Durch Hinzufügen eines tree
-Befehls wird nun wie folgt gedruckt:
# ~/my-html-app [13:03:45]$ tree
.
| ____ app.js
| ____ css
| | ____ main.css
| | ____ theme.css
| ____ index.html
Hinzufügen eines kleinen Punktes zu @apuche’s answer for OSX El Capitan rootless feature. make install
schlägt fehl, da es uns nicht erlaubt ist, in das Verzeichnis /usr/bin
zu schreiben.
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, editieren Sie einfach Makefile
, um prefix = /usr/local
zu haben
Hier ist eine Ruby-Skriptlösung, die einen netten 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 "#{path}"`.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/]}#{n}s" }.join(' ')
cols.map{ |a| a.length==1 ? a.first : tmpl % a }
end
puts tree(ARGV.first || ".") if __FILE__ ==$0
Sie könnten die Zeile meta = …
modifizieren, um verschiedene Metadaten für die Anzeige zu extrahieren, wobei Sie die geteilten Teile in der nächsten Zeile von Hand aussuchen. Mit etwas mehr Arbeit könnten Sie beliebige ls-Argumente übergeben, um die anzuzeigenden Metadaten auszuwählen.
Beispielausgabe (sieht im OS X-Terminal schöner aus als die Schriftart bei Stapelüberlauf):
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
Ich fügte Folgendes zum ~/.bash_profile für die Verwendung in Terminal.app hinzu. Einige Kommentare sind enthalten, um sich daran zu erinnern, wie find 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 ${1:-.} -print | sed -e 's;[^/]*/;| ____;g;s;____ |; |;g'
}
Beispiel für das aktuelle Verzeichnis
$> tree
Beispiel für einen Pfad
$> tree /some/path
installieren 2. Befehlszeilentools holen
xcode-select --install
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install tree
Spät im Spiel, aber ich hatte die gleiche Frage. Aufgrund von Arbeitsplatzbeschränkungen konnte ich kein Paket aus dem Quellcode oder über einen Paketmanager eines Drittanbieters installieren.
Dies ist meine Implementierung:
# Faux tree command in OS X
#####################################################################
# tree
# Recursive directory/file listing of present working directory
#
# tree /Users/foo/foo_dir
# Recursive directory/file listing of named directory, e.g foo_dir
#
# tree /System/Library/ 2
# Recursive directory/file listing of named directory,
# with-user defined depth of recursion, e.g. 2
#####################################################################
tree ()
{
[-n "$2"] && local depth="-maxdepth $2";
find "${1:-.}" ${depth} -print 2> /dev/null | sed -e 's;[^/]*/;| ____;g;s;____ |; |;g'
}
Fügen Sie einfach die Funktion zu /Users/foo/.profile
oder .bash_profile
hinzu, und aktualisieren Sie dann das Profil mit: source .profile
oder: source .bash_profile