Mac OS X odpowiednik polecenia „drzewo” Ubuntu


Odpowiedzi:


438

treePolecenie można także uzyskać w systemie macOS. Jeśli masz Homebrew , wszystko, co musisz zrobić, to uruchomić:

brew install tree

Czytaj dalej, aby poznać szczegóły.


Z menedżerem pakietów

Istnieje kilka menedżerów pakietów dla systemu macOS. Najpopularniejsze to: Homebrew , MacPorts lub Fink . Możesz zainstalować jeden, ale polecam Homebrew. Nie instaluj więcej niż jednego z nich jednocześnie!

Postępuj zgodnie z instrukcjami w witrynie, a następnie uruchom jedno z następujących poleceń, w zależności od wybranego menedżera pakietów.

Dla Homebrew:

brew install tree

W przypadku MacPorts:

sudo port install tree

Dla Fink:

fink install tree

Menedżerowie pakietów oferują inne programy wiersza poleceń, w tym GNU / Linux, które domyślnie nie są dostarczane z macOS.

Instalowanie ze źródła

Najpierw musisz zainstalować narzędzia wiersza polecenia Xcode, uruchamiając xcode-select --install.

Następnie pobierz treeźródło . Następnie zmień plik Makefile, aby działał , co wyjaśniono również w odpowiedzi @ apuche poniżej . Wystarczy skomentować opcje Linuksa i odkomentować opcje macOS.

Następnie należy uruchomić ./configure, a następnie make.

Teraz musisz przenieść treeplik binarny do lokalizacji znajdującej się na ścieżce wykonywalnej. Na przykład:

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

Teraz edytuj, ~/.bash_profileaby uwzględnić:

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

Załaduj ponownie powłokę, a teraz which treepowinna wskazywać /usr/local/bin/tree.


shaunchapmanblog.com/post/329270449/... również wydaje się mieć szczegółowe instrukcje, ale może powodować problemy z llvm-gcc żyjącym w / Developer, jeśli używasz Xcode 4.x; odrobina zabawy powinna załatwić sprawę.
Ahmed Masud

1
@DavidMoles Ponieważ po prostu działa makena OS X nie działa. Najpierw musisz wiedzieć, jak zainstalować narzędzia wiersza polecenia Xcode (lub ogólnie, masz pomysł na temat budowania oprogramowania), a potem okaże się, że zawiera błędy w nieokreślonym symbolu. Musisz więc wprowadzić pewne poprawki do pliku makefile (jak wyjaśniono tutaj ). Za dużo kłopotów IMO.
slhck

3
@ 7stud Wiele osób zna kilka narzędzi wiersza poleceń do bardzo prostych zadań CLI i może nie wiedzieć, jak skompilować oprogramowanie. Ludzie czasami ciężko się zrozumieć, co ./configurei makedokładnie zrobić i dlaczego te są potrzebne w pierwszej kolejności. Albo nie chcą sobie z tym poradzić. Lub przeczytaj dowolne pliki pomocy. Wolą zrobić coś takiego apt-get install. W porządku, jeśli wolisz instalacje ze źródła (i ja też tak robię), ale musisz zaakceptować, że istnieją rozwiązania, które są postrzegane przez innych, a może nawet przez większość zwykłych użytkowników komputerów.
slhck,

1
Ludzie czasami walczyć aby zrozumieć, co ./configure i zrobić dokładnie i dlaczego te są potrzebne w pierwszej kolejności Byłem instalowania oprogramowania ze źródeł przez 15 lat i nie mam pojęcia co ./configurei makezrobienia. Wiem tylko, że są to kroki, które muszę wykonać, aby zainstalować oprogramowanie. Ślepo czytam pliki README i INSTALL i robię wszystko, co mówi.
7stud

1
@DhruvGhulati Nie wiem o tym, ale można to odwrócić grep. Jak tree | grep -v 'json'lub podobny.
slhck

33

Niezupełnie to samo, ale jednym szybkim sposobem na Macu jest:

find .

i to wszystko. Wyświetli listę wszystkich ścieżek plików w bieżącym katalogu jako listę.


Jeśli jesteś zainteresowany konkretnym katalogiem: znajdź ./ <
nazwa_katalogu

Zainteresowany tylko plikamifind . -type f
Jared Beck,

2
Byłem zainteresowany jedynie zejściem na kilka poziomów, aby pokazać strukturę katalogów, więc find . -type d -maxdepth 2zadziałało dla mnie
Matthew Lock,

Lepsze użycie, find *jeśli nie chcesz widzieć ukrytych plików i katalogów. treedomyślnie nie wyświetla ukrytych plików i katalogów.
asmaier

findjest narzędziem 万金油.
Evan Hu

22

Lub jeśli administrator nie pozwoli Ci zainstalować dowolną z brew, fink, portnarzędzia zawsze można zbudować go od źródła:

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

Edytuj plik Makefile, aby komentować część linux i odkomentować obszar osx:

# 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

Opcjonalnie: Wymuszanie wydruku w kolorze

A jeśli już na tym jesteś, jeśli chcesz zmusić drzewo, aby zawsze kolorowało dane wyjściowe, zawsze możesz edytować mainmetodę tree.cpliku i dodać force_color=TRUE;wcześniejsetLocale(LC_TYPE,"");

W końcu naciśnij makei gotowe treedla Maca.

Hołd dla Shauna Chapmana za jego oryginalny post na swoim blogu.


Nie udało się dostać na stronę Shaun; dzięki za informację o modyfikacji pliku Makefile.
Paul Nathan

W szczególności możesz dodać force_color = TRUE;. Bez średnika i pojawia się błąd kompilacji.
tgrosinger

1
Właśnie zbudowałem wersję 1.7 i zamiast setLocaleniej setlocale. Więc tree.cszukasz setlocale(LC_TYPE,""); i dzięki!
Avi Cohen

Świetna odpowiedź. Czy możesz dodać notatkę o tym, jak ją przenieść /bin(lub jakąś ścieżkę, aby można było z niej korzystać globalnie)?
Khanh Nguyen,

FYI, kompilacji 1.7.0 pod Yosemite mam: warning: format specifies type 'long' but the argument has type 'long long'. Rozwiązaniem była zmiana specyfikatora formatu z %9ldna %9lld.
David Moles,


18

Nie ma formalnego treepolecenia jako takiego, ale możesz to zrobić:

Zapisz następujący skrypt w / 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

Zmień uprawnienia, aby móc je uruchomić:

chmod 755 /usr/local/bin/tree 

Oczywiście może być konieczne utworzenie /usr/local/bin:

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

Brakuje wszystkich opcji tree, ale wciąż jest to miłe, małe rozwiązanie.
slhck 21.11.11

@slhck hehe to było szybkie rozwiązanie hakerskie ...
Ahmed Masud

Możesz jednak podać swoje zmienne.
slhck 21.11.11

$ x powinien być $ dirlist nie powinien być cytowany ... ze względu na specjalne rozszerzenie „$ @”
Ahmed Masud

1
@JenS. oczywiście możesz po prostu zmienić komendę find, aby sobie z tym poradzić
Ahmed Masud

5

Alternatywne użycie findi awk:

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

4

Znalazłem tutaj proste rozwiązanie: http://murphymac.com/tree-command-for-mac/

Więc dodanie następujących do Twojego .bashrc, .bash_profilelub jakiekolwiek inne miejsce, będzie to działa:

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

Teraz dodanie treepolecenia zostanie wydrukowane w następujący sposób:

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

3

Dodanie małej wskaż odpowiedź @ apuche jest dla OSX El Capitan wykorzenionego funkcji. make installkończy się niepowodzeniem, ponieważ nie możemy pisać do /usr/binkatalogu.

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$

Aby temu zaradzić, po prostu edytuj, Makefileaby miećprefix = /usr/local


To technicznie działa. Ale to jest inwazyjne. Prawdopodobnie mógłbyś biec ./configure --prefix=/usr/localprzed uruchomieniem makei make installosiągnąłby te same wyniki.
JakeGould,

2
@JakeGould Oczywiście, używam prefixw takich scenariuszach. Ale configurew najnowszej wersji drzewa (1.7.0) nie ma już pliku . INSTALLPlik w katalogu rozpakowane tylko mówi w użyciu makei make installod razu.
vikas027

2

Dodałem następujące do ~ / .bash_profile do użytku w Terminal.app. Niektóre komentarze są dołączone, aby pomóc zapamiętać, w jaki sposób funkcja wyszukiwania jest używana.

##########
## 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'
}

przykład dla bieżącego katalogu

$> tree

przykład dla jakiejś ścieżki

$> tree /some/path

2

Oto rozwiązanie skryptowe Ruby, które tworzy ładne drzewo Unicode wraz z przydatnymi metadanymi.

#!/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

Możesz zmodyfikować meta = …linię, aby wyodrębnić różne metadane do wyświetlenia, ręcznie wybierając podzielone elementy w następnym wierszu. Przy odrobinie pracy można przekazać dowolne argumenty ls, aby wybrać metadane do wyświetlenia.

Przykładowe dane wyjściowe (ładniej wygląda w terminalu OS X niż czcionka w przepełnieniu stosu):

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
Bardzo dziękuję za lekkie rozwiązanie! W OSX 10.9.5 (działający skrypt Ruby 2.0.0), z powodu błędu „niejawnej konwersji wartości true na String (TypeError)” musiałem zmienić szósty wiersz metody #tree, aby odczytać plik = nazwa pliku. (ścieżka) + (File.directory?(path)? '/': '')
joel.neely 16.07.16

1

Nie jest tak ładny jak drzewo GNU ... ale jest naprawdę łatwy do aliasu w bash ... Możesz nawet dodać trochę koloru, dodając opcję G do koloru ls osxa.

alias tree='find . -type d | ls -lARG'

1
  1. Zainstaluj Xcode

  2. Uzyskaj narzędzia wiersza poleceń

xcode-select --install
  1. Zainstaluj Homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  1. Zainstaluj drzewo
brew install tree

1
Wspomniano już w dwóch poprzednich odpowiedziach w 2011 i 2016 r. Czy potrzebujemy trzeciej odpowiedzi, która mówi to samo?
Jason S,

0

Późno do gry, ale miałem to samo pytanie. Z powodu ograniczeń w miejscu pracy nie mogłem zainstalować pakietu ze źródła lub za pośrednictwem zewnętrznego menedżera pakietów.

To jest moja realizacja:

# 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'
}

Po prostu dodaj funkcję do /Users/foo/.profilelub .bash_profile, a następnie odśwież profil za pomocą: source .profilelub:source .bash_profile

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.