Mac OS X equivalente al comando "árbol" de Ubuntu
¿Existe un equivalente al comando Ubuntu tree
para Mac OS X?
¿Existe un equivalente al comando Ubuntu tree
para Mac OS X?
También puedes obtener el comando tree
en MacOS. Si tienes Homebrew , todo lo que necesitas es ejecutar:
brew install tree
Sigue leyendo para más detalles.
Hay varios gestores de paquetes para macOS. Los más populares son: Homebrew , MacPorts , o Fink . Puedes instalar cualquiera de ellos, pero yo recomiendo Homebrew. No instales más de uno de estos al mismo tiempo!
Sigue las instrucciones de la página web, y luego ejecuta uno de los siguientes comandos, dependiendo del administrador de paquetes que hayas elegido.
Para Homebrew:
brew install tree
Para MacPorts:
sudo port install tree
Para Fink:
fink install tree
Los gestores de paquetes ofrecen otros programas de línea de comandos, incluyendo los de GNU/Linux que no vienen con macOS por defecto.
Primero, tienes que instalar las herramientas de línea de comando de Xcode ejecutando xcode-select --install
.
Luego, descargar la fuente de tree
. Luego cambiar el Makefile para que funcione, lo que también se explica en la respuesta de @apuche más abajo. Comentar las opciones de Linux y descomentar las opciones de MacOS debería ser suficiente.
Entonces, ejecuta ./configure
, luego make
.
Ahora tienes que mover el archivo binario tree
a una ubicación que esté en tu ruta de ejecución. Por ejemplo:
sudo mkdir -p /usr/local/bin
sudo cp tree /usr/local/bin/tree
Ahora edita tu ~/.bash_profile
para incluir:
export PATH="/usr/local/bin:$PATH"
Recarga el shell, y ahora which tree
debe apuntar a /usr/local/bin/tree
.
No es exactamente lo mismo, pero una forma rápida en el Mac es:
find .
y eso es todo. Se listarán todas las rutas de archivos en el directorio actual como una lista.
O si tu administrador no te permite instalar ninguna de las herramientas brew
, fink
, port
siempre puedes construirlo desde la fuente :
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
Editar el Makefile para comentar la parte de linux y descomentar el área de 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
Y ya que estás en ello, si quieres forzar el árbol para que siempre coloree la salida, siempre puedes editar el método main
del archivo tree.c
y añadir force_color=TRUE;
antes de setLocale(LC_TYPE,"");
Finalmente pulsa make
y habrás terminado de construir tree
para mac.
El tributo va para Shaun Chapman por su entrada original en su blog.
No hay un comando formal tree
per se, sin embargo puedes hacer esto:
Guarda el siguiente script en /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
Cambia los permisos para que puedas ejecutarlo:
chmod 755 /usr/local/bin/tree
Por supuesto que tendrás que crear /usr/local/bin
:
sudo mkdir -p /usr/local/bin/tree
Encontré una solución simple aquí: http://murphymac.com/tree-command-for-mac/
Así que agregando lo siguiente a tu .bashrc
, .bash_profile
o cualquier otro lugar lo hará funcionar:
alias tree="find . -print | sed -e 's;[^/]*/;| ____;g;s;____ |; |;g'"
Ahora agregando un comando tree
se imprimirá así:
# ~/my-html-app [13:03:45]$ tree
.
| ____ app.js
| ____ css
| | ____ main.css
| | ____ theme.css
| ____ index.html
Añadiendo un pequeño punto a @apuche’s answer para la característica OSX El Capitan rootless . make install
falla ya que no se nos permite escribir en el directorio /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$
Para superar esto, simplemente edite Makefile
para tener prefix = /usr/local
Aquí hay una solución de script Ruby que produce un bonito árbol Unicode junto con metadatos útiles.
#!/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
Podrías modificar la línea meta = …
para extraer diferentes metadatos para mostrar, escogiendo a mano las piezas divididas en la siguiente línea. Con un poco más de trabajo podrías pasar argumentos arbitrarios de ls para seleccionar los metadatos a mostrar.
Salida de muestra (se ve mejor en la terminal OS X que la fuente en 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
Añadí lo siguiente a ~/.bash_profile para su uso en Terminal.app. Se incluyen algunos comentarios para ayudar a recordar cómo se está usando 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'
}
ejemplo para el directorio actual
$> tree
ejemplo para alguna ruta
$> tree /some/path
Instalar Xcode
Obtener herramientas de línea de comando
xcode-select --install
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install tree
Llegué tarde al partido, pero tenía la misma pregunta. Debido a las restricciones del lugar de trabajo, no pude instalar un paquete desde la fuente o a través de un gestor de paquetes de terceros.
Esta es mi implementación:
# 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'
}
Simplemente añade la función a /Users/foo/.profile
o .bash_profile
, y luego actualiza el perfil con: source .profile
o: source .bash_profile