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.