¿Hay un equivalente al tree
comando Ubuntu para Mac OS X?
¿Hay un equivalente al tree
comando Ubuntu para Mac OS X?
Respuestas:
También puede obtener el tree
comando en macOS. Si tiene Homebrew , todo lo que necesita hacer 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 . Puede instalar cualquiera de los dos, pero recomiendo Homebrew. ¡No instale más de uno al mismo tiempo!
Siga las instrucciones en el sitio web, luego ejecute uno de los siguientes comandos, dependiendo del administrador de paquetes que elija.
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, incluidos los de GNU / Linux que no vienen con macOS de forma predeterminada.
Primero, debe instalar las herramientas de línea de comandos Xcode ejecutando xcode-select --install
.
Luego, descargue la tree
fuente . Luego cambie el Makefile para que funcione , que también se explica en la respuesta de @ apuche a continuación . Comentar las opciones de Linux y descomentar las opciones de macOS debería ser suficiente.
Entonces, corre ./configure
, entonces make
.
Ahora debe mover el tree
archivo binario a una ubicación que esté en su ruta ejecutable. Por ejemplo:
sudo mkdir -p /usr/local/bin
sudo cp tree /usr/local/bin/tree
Ahora edite su ~/.bash_profile
para incluir:
export PATH="/usr/local/bin:$PATH"
Vuelva a cargar el shell, y ahora which tree
debería señalar /usr/local/bin/tree
.
make
en OS X no funciona. Primero, debe saber cómo instalar las herramientas de línea de comandos de Xcode (o, en general, tener alguna idea sobre la creación de software) y luego encontrará que se equivoca en un símbolo indefinido. Por lo tanto, debe hacer algunos ajustes en el archivo MAKE (como se explica aquí ). Demasiada molestia OMI.
./configure
y make
exactamente hacer y por qué se necesitan en primer lugar. O no quieren lidiar con eso. O lea cualquier archivo de ayuda, para el caso. Prefieren hacer algo así apt-get install
. Está bien si prefiere las instalaciones desde la fuente (y yo personalmente también), pero debe aceptar que hay soluciones que otros perciben más fácilmente, o tal vez incluso la mayoría de los usuarios normales de computadoras.
./configure
y make
hacer. Solo sé que son pasos que debo realizar para instalar el software. Leí ciegamente los archivos README e INSTALL, y hago lo que dice.
grep
. Me gusta tree | grep -v 'json'
o similar.
No es exactamente lo mismo, pero una forma rápida en Mac es:
find .
y eso es. Enumerará todas las rutas de archivos en el directorio actual como una lista.
find . -type f
find . -type d -maxdepth 2
funcionó para mí
find *
si no desea ver archivos y directorios ocultos. tree
no muestra archivos y directorios ocultos por defecto.
find
es una herramienta 万金油.
O si el administrador no le permitirá instalar cualquiera de los brew
, fink
, port
herramientas siempre se puede construir de 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
Edite 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 mientras lo hace, si desea forzar al árbol para que siempre coloree la salida, siempre puede editar el main
método del tree.c
archivo y agregarlo force_color=TRUE;
antessetLocale(LC_TYPE,"");
Finalmente presiona make
y has terminado tree
de compilar para mac.
Homenaje a Shaun Chapman por su publicación original en su blog.
force_color = TRUE;
. Sin punto y coma y obtienes un error de compilación.
setLocale
su setlocale
. Entonces tree.c
, buscas setlocale(LC_TYPE,"")
; ¡y gracias!
/bin
(o alguna ruta para que pueda usarse globalmente)?
warning: format specifies type 'long' but the argument has type 'long long'
. La solución fue cambiar un especificador de formato de %9ld
a %9lld
.
No hay un tree
comando formal per se, sin embargo, puede hacer esto:
Guarde 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, puede que tenga que crear /usr/local/bin
:
sudo mkdir -p /usr/local/bin/tree
tree
, pero sigue siendo una buena solución.
Encontré una solución simple aquí: http://murphymac.com/tree-command-for-mac/
Por lo tanto, agregar lo siguiente a su .bashrc
, .bash_profile
o cualquier otro lugar hará que funcione:
alias tree="find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'"
Ahora agregar un tree
comando se imprimirá así:
# ~/my-html-app [13:03:45]$ tree
.
|____app.js
|____css
| |____main.css
| |____theme.css
|____index.html
Agregando un pequeño punto a la respuesta de @ apuche para la función sin raíz OSX El Capitan . make install
falla ya que no podemos escribir en el /usr/bin
directorio.
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, solo edite Makefile
para tenerprefix = /usr/local
./configure --prefix=/usr/local
antes de ejecutar make
y make install
obtendría los mismos resultados.
Agregué lo siguiente a ~ / .bash_profile para usarlo en Terminal.app. Se incluyen algunos comentarios para ayudar a recordar cómo se utiliza 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 algún camino
$> tree /some/path
Aquí hay una solución de script Ruby que produce un buen á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
Puede modificar la meta = …
línea para extraer diferentes metadatos para mostrar, seleccionando manualmente las piezas divididas en la siguiente línea. Con un poco más de trabajo, podría pasar argumentos arbitrarios de ls para seleccionar los metadatos a mostrar.
Salida de muestra (se ve mejor en el 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
Instalar Xcode
Obtener herramientas de línea de comandos
xcode-select --install
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install tree
Tarde al juego, pero tenía la misma pregunta. Debido a restricciones en el lugar de trabajo, no pude instalar un paquete desde la fuente o a través de un administrador 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 agregue la función a /Users/foo/.profile
o .bash_profile
, luego actualice el perfil con: source .profile
o:source .bash_profile