Mac OS X equivalente al comando "albero" Ubuntu
Esiste un equivalente al comando Ubuntu tree
per Mac OS X?
Esiste un equivalente al comando Ubuntu tree
per Mac OS X?
È possibile ottenere il comando tree
anche su macOS. Se avete Homebrew , tutto quello che dovete fare è eseguire:
brew install tree
Read on per i dettagli.
Ci sono diversi gestori di pacchetti per macOS. I più popolari sono: Homebrew , MacPorts , o Fink . Potete installarne uno dei due, ma vi consiglio Homebrew. Non installarne più di uno contemporaneamente!
Seguire le istruzioni sul sito web, quindi eseguire uno dei seguenti comandi, a seconda del gestore di pacchetti che si è scelto.
Per Homebrew:
brew install tree
``` ```
sudo port install tree
Per MacPorts:
fink install tree
``` ```
sudo mkdir -p /usr/local/bin
sudo cp tree /usr/local/bin/tree
Per Fink:
export PATH="/usr/local/bin:$PATH"
``` &001
I gestori di pacchetti offrono altri programmi a riga di comando, compresi quelli GNU/Linux che non hanno macOS di default.
### Installazione dai sorgenti
Prima di tutto, si devono installare gli strumenti della riga di comando Xcode eseguendo `xcode-select --install`.
Poi, [ scaricare i sorgenti `tree` ](http://mama.indstate.edu/users/ice/tree/). Poi [ cambiare il Makefile per farlo funzionare ](http://andre-als.blogspot.de/2012/02/how-to-install-command-tree-for-mac.html), che è anche spiegato nella risposta di [ @apuche qui sotto ](https://superuser.com/questions/359723/mac-os-x-equivalent-of-the-ubuntu-tree-command/#448969). Commentare le opzioni di Linux e decommentare le opzioni di macOS dovrebbe essere sufficiente.
Poi, eseguire `./configure`, poi `make`.
Ora si deve spostare il file binario `tree` in una posizione che si trova nel percorso eseguibile. Per esempio:
&001 &001
Ora modificate il vostro `~/.bash_profile` per includere:
&001 &001
Ricaricate la shell, e ora `which tree` dovrebbe puntare a `/usr/local/bin/tree`.
Non esattamente la stessa cosa, ma un modo veloce sul Mac è:
find .
e basta. Elencherà tutti i percorsi dei file nella directory corrente come elenco.
O se il vostro amministratore non vi permette di installare nessuno degli strumenti brew
, fink
, port
, main
potete sempre costruirlo dal sorgente :
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
``` &001
# Opzionale: Forzare l'output a colori
E già che ci sei, se vuoi forzare l'albero a colorare sempre l'output, puoi sempre modificare il metodo `tree.c` del file `force_color=TRUE;` e aggiungere `setLocale(LC_TYPE,"");` prima di `make`
Infine premi `tree` e hai finito di costruire &007 per mac.
Tribute va a [ Shaun Chapman ](https://web.archive.org/web/20130527203022/http://shaunchapman.me/post/329270449/how-to-install-the-tree-command-on-mac-os-x) per il suo post originale sul suo blog.
Non esiste un comando formale tree
di per sé, tuttavia è possibile 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 i permessi in modo da poterlo eseguire:
chmod 755 /usr/local/bin/tree
Naturalmente potrebbe essere necessario creare /usr/local/bin
:
sudo mkdir -p /usr/local/bin/tree
Ho trovato una soluzione semplice: http://murphymac.com/tree-command-for-mac/ &003
Quindi l'aggiunta di quanto segue al vostro .bashrc
, .bash_profile
o qualsiasi altro posto lo farà funzionare:
alias tree="find . -print | sed -e 's;[^/]*/;| ____;g;s;____ |; |;g'"
Ora aggiungendo un comando tree
si stampa così:
# ~/my-html-app [13:03:45]$ tree
.
| ____ app.js
| ____ css
| | ____ main.css
| | ____ theme.css
| ____ index.html
Aggiungendo un piccolo punto alla risposta di @apuche per OSX El Capitan rootless . make install
fallisce poiché non siamo autorizzati a scrivere nella directory /usr/bin
.
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$
``` &001
Per superare questo, basta modificare `Makefile` per avere `prefix = /usr/local`
Ecco una soluzione di script Ruby che produce un bell'albero Unicode insieme a metadati utili.
#!/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
``` ```
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
Si potrebbe modificare la linea meta = …
per estrarre diversi metadati da visualizzare, scegliendo a mano i pezzi divisi sulla linea successiva. Con un po’ più di lavoro si potrebbero passare argomenti ls arbitrari per selezionare i metadati da mostrare.
Uscita campione (sembra più bello nel terminale OS X rispetto al font su Stack Overflow):
&001
Ho aggiunto quanto segue al ~/.bash_profilo per l'utilizzo in Terminal.app. Sono inclusi alcuni commenti che aiutano a ricordare come si utilizza la ricerca.
##########
## 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 alcuni percorsi
$> tree /some/path
xcode-select --install
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install tree
In ritardo sulla partita, ma avevo la stessa domanda. A causa di restrizioni sul posto di lavoro, non ho potuto installare un pacchetto da fonte o tramite un gestore di 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'
}
Aggiungete semplicemente la funzione a /Users/foo/.profile
o .bash_profile
, quindi aggiornate il profilo con: source .profile
o: source .bash_profile