2011-11-21 10:38:01 +0000 2011-11-21 10:38:01 +0000
330
330

Mac OS X-Äquivalent zum Ubuntu-"Baum"-Befehl

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

Antworten (13)

460
460
460
2011-11-21 10:52:07 +0000

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.


Mit einem Paketmanager

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.

Installation aus dem Quellcode

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.

36
36
36
2014-05-02 13:31:59 +0000

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.

22
22
22
2012-07-14 23:09:46 +0000

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

Optional: Farbausgabe erzwingen

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.

21
21
21
2016-06-30 16:30:36 +0000

Sie sollten wahrscheinlich homebrew verwenden. Wenn Sie das tun:

brew install tree
18
18
18
2011-11-21 10:53:07 +0000

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
6
6
6
2012-04-07 12:10:48 +0000

Eine Alternative unter Verwendung von find und awk:

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

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
3
3
3
2016-01-12 03:16:16 +0000

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

2
2
2
2014-11-27 19:19:26 +0000

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
2
2
2
2014-06-05 02:20:04 +0000

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
1
1
1
2012-06-08 07:30:13 +0000

Es ist nicht so hübsch wie Gnu-Baum … aber es ist wirklich einfach, in bash einen Alias zu verwenden … Sie können sogar ein wenig Farbe hinzufügen, indem Sie die G-Option an die ls-Farbe von osx anheften.

alias tree='find . -type d | ls -lARG'
1
1
1
2017-02-21 08:29:03 +0000
  1. Xcode

installieren 2. Befehlszeilentools holen

xcode-select --install
  1. Homebrew installieren
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  1. installieren Baum
brew install tree
0
0
0
2017-10-16 14:50:54 +0000

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

Verwandte Fragen

12
10
5
8
21