Equivalente a Mac OS X del comando "albero" di Ubuntu


Risposte:


438

Puoi ottenere il treecomando anche su macOS. Se hai Homebrew , tutto ciò che devi fare è eseguire:

brew install tree

Continua a leggere per i dettagli.


Con un gestore di pacchetti

Esistono diversi gestori di pacchetti per macOS. I più popolari sono: Homebrew , MacPorts o Fink . Puoi installarne uno, ma raccomando Homebrew. Non installare più di uno di questi contemporaneamente!

Seguire le istruzioni sul sito Web, quindi eseguire uno dei seguenti comandi, a seconda del gestore dei pacchetti scelto.

Per l'homebrew:

brew install tree

Per MacPorts:

sudo port install tree

Per Fink:

fink install tree

I gestori pacchetti offrono altri programmi da riga di comando, inclusi quelli GNU / Linux che non vengono forniti con macOS per impostazione predefinita.

Installazione da sorgente

Innanzitutto, è necessario installare gli strumenti della riga di comando Xcode eseguendo xcode-select --install.

Quindi, scarica la treefonte . Quindi cambia il Makefile per farlo funzionare , che è anche spiegato nella risposta di @ apuche di seguito . Commentare le opzioni di Linux e decommentare le opzioni di macOS dovrebbe essere sufficiente.

Quindi, corri ./configure, quindi make.

Ora devi spostare il treefile binario in una posizione che si trova nel tuo percorso eseguibile. Per esempio:

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

Ora modifica il tuo ~/.bash_profileper includere:

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

Ricarica la shell e ora which treedovrebbe puntare a /usr/local/bin/tree.


shaunchapmanblog.com/post/329270449/… sembra anche avere istruzioni dettagliate ma può causare problemi con llvm-gcc che vive sotto / Developer se si esegue Xcode 4.x; un po 'di giocherellare in giro dovrebbe fare il trucco.
Ahmed Masud,

1
@DavidMoles Perché la semplice esecuzione makesu OS X non funziona. Innanzitutto, devi sapere come installare gli strumenti da riga di comando Xcode (o in generale, avere qualche idea sulla creazione di software) e poi scoprirai che si guasta su un simbolo indefinito. Quindi devi apportare alcune modifiche al makefile (come spiegato qui ). Troppo fastidio IMO.
slhck,

3
@ 7stud Molte persone conoscono alcuni strumenti da riga di comando per attività CLI molto semplici e potrebbero non sapere come compilare il software. La gente a volte fatica a capire che cosa ./configuree makeesattamente fare e perché coloro sono necessari, in primo luogo. O non vogliono affrontarlo. O leggi tutti i file di aiuto, del resto. Preferirebbero fare qualcosa del genere apt-get install. Va bene se preferisci le installazioni dal sorgente (e lo faccio anch'io personalmente), ma devi accettare che ci sono soluzioni che sono percepite più facilmente da altri, o forse anche dalla maggior parte dei normali utenti di computer.
Slhck,

1
Le persone a volte fanno fatica a capire cosa ./configurare e fare esattamente e perché sono necessarie in primo luogo Ho installato software dal sorgente per 15 anni e non ho idea di cosa ./configuree cosa makefare. So solo che sono i passaggi che devo eseguire per installare il software. Ho letto alla cieca i file README e INSTALL, e faccio qualunque cosa dica.
7stud

1
@DhruvGhulati Non che io sappia, ma potresti invertire- grep. Mi piace tree | grep -v 'json'o simile.
slhck,

33

Non esattamente lo stesso, ma un modo rapido sul Mac è:

find .

e basta. Elencherà tutti i percorsi dei file nella directory corrente come un elenco.


Se interessati a una directory particolare: find ./ <dir_name>
raspacorp

Se solo interessato ai file,find . -type f
Jared Beck

2
Ero interessato solo ad approfondire alcuni livelli per mostrare la struttura delle directory, quindi ha find . -type d -maxdepth 2funzionato per me
Matthew Lock,

Meglio usarlo find *se non vuoi vedere file e directory nascosti. treenon mostra file e directory nascosti per impostazione predefinita.
asmaier

findè uno strumento 万金油.
Evan Hu

22

O se l'amministratore non vi permetterà di installare una qualsiasi delle brew, fink, portgli strumenti si può sempre costruire dalla fonte:

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

Modifica il Makefile per commentare la parte Linux e decommentare l'area 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

Opzionale: forzare l'output a colori

E mentre ci sei, se vuoi forzare l'albero a colorare sempre l'output, puoi sempre modificare il mainmetodo del tree.cfile e aggiungere force_color=TRUE;primasetLocale(LC_TYPE,"");

Finalmente colpito makee hai finito di costruire treeper Mac.

L'omaggio va a Shaun Chapman per il suo post originale sul suo blog.


Impossibile accedere al sito Web di Shaun; grazie per il testa a testa sulla modifica del Makefile.
Paul Nathan,

In particolare, è possibile aggiungere force_color = TRUE;. Nessun punto e virgola e viene visualizzato un errore di compilazione.
tgrosinger,

1
Ho appena creato la versione 1.7 e non la setLocalesua setlocale. Quindi tree.c, cerchi setlocale(LC_TYPE,""); e grazie!
Avi Cohen,

Bella risposta. Puoi aggiungere una nota su come spostarlo /bin(o un percorso in modo che possa essere utilizzato a livello globale)?
Khanh Nguyen,

Cordiali saluti, la compilazione 1.7.0 sotto Yosemite ho ricevuto: warning: format specifies type 'long' but the argument has type 'long long'. La correzione era cambiare un identificatore di formato da %9lda %9lld.
David Moles,


18

Non esiste un treecomando formale in sé, tuttavia puoi farlo:

Salvare il seguente script 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

Modifica le autorizzazioni in modo da poterle eseguire:

chmod 755 /usr/local/bin/tree 

Ovviamente potresti dover creare /usr/local/bin:

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

Manca tutte le opzioni di tree, ma rimane comunque una bella piccola soluzione.
slhck,

@slhck hehe è stata una soluzione di hacking rapido ...
Ahmed Masud,

Potresti voler citare le tue variabili però.
slhck,

$ x dovrebbe essere $ dirlist non dovrebbe essere quotato ... a causa della speciale espansione di "$ @"
Ahmed Masud,

1
@JenS. ovviamente puoi semplicemente cambiare il comando find per affrontarlo
Ahmed Masud,

5

Un'alternativa usando finde awk:

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

4

Ho trovato una soluzione semplice qui: http://murphymac.com/tree-command-for-mac/

Quindi aggiungendo quanto segue al vostro .bashrc, .bash_profileo qualsiasi altro luogo renderà il lavoro:

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

Ora aggiungendo un treecomando verrà stampato in questo modo:

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

3

Aggiungendo un piccolo punto alla risposta di @apuche per la funzione rootless di OSX El Capitan . make installha esito negativo poiché non è consentito scrivere nella /usr/bindirectory.

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$

Per ovviare a questo, basta modificare Makefileper avereprefix = /usr/local


Bene, tecnicamente funziona. Ma è invasivo. Quindi probabilmente potresti correre ./configure --prefix=/usr/localprima di correre makee make installotterresti gli stessi risultati.
Jake Gould

2
@JakeGould Assolutamente, lo uso prefixin tali scenari. Ma non ci sono configurefile nell'ultima versione di tree (1.7.0) ora. Il INSTALLfile nella directory decompressa dice solo di usare makee make installsubito.
vikas027,

2

Ho aggiunto quanto segue a ~ / .bash_profile per l'uso in Terminal.app. Alcuni commenti sono inclusi per aiutare a ricordare come viene utilizzato find.

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

esempio per la directory corrente

$> tree

esempio per qualche percorso

$> tree /some/path

2

Ecco una soluzione di script Ruby che produce un simpatico albero Unicode insieme a utili metadati.

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

È possibile modificare la meta = …linea per estrarre diversi metadati da visualizzare, selezionando manualmente i pezzi divisi nella riga successiva. Con un po 'più di lavoro potresti passare argomenti ls arbitrari per selezionare i metadati da mostrare.

Output di esempio (sembra più bello nel terminale OS X rispetto al carattere su 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

2
Grazie mille per la soluzione leggera! Su OSX 10.9.5 (in esecuzione stock Ruby 2.0.0), a causa di un errore "nessuna conversione implicita di true in String (TypeError)", ho dovuto cambiare la sesta riga del metodo #tree per leggere file = File.basename (percorso) + (File.directory?(path)? '/': '')
joel.neely

1

Non è bello come l'albero di gnu ... ma è davvero facile alias in bash ... Puoi persino aggiungere un po 'di colore virando sull'opzione G sul colore di ls di osx.

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

1
  1. Installa Xcode

  2. Ottieni strumenti da riga di comando

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

1
Già menzionato in due precedenti risposte nel 2011 e nel 2016. Abbiamo bisogno di una terza risposta che dica la stessa cosa?
Jason S,

0

In ritardo al gioco, ma avevo la stessa domanda. A causa delle restrizioni sul posto di lavoro, non ho potuto installare un pacchetto dalla fonte o tramite un gestore pacchetti di terze parti.

Questa è la mia implementazione:

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

Aggiungi semplicemente la funzione a /Users/foo/.profileo .bash_profile, quindi aggiorna il profilo con: source .profileo:source .bash_profile

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.