Pregunta Mac OS X equivalente al comando "árbol" de Ubuntu


¿Hay un equivalente a Ubuntu? tree mando para Mac OS X?


265


origen




Respuestas:


Sí, la hay, y se llama tree.

Puedes instalarlo

  • de la fuente o
  • con un administrador de paquetes

El primero puede parecer un poco complicado si nunca antes compiló el código fuente. Requiere la edición de algunos archivos. Este último tiene un poco de sobrecarga (porque es posible que no necesite un administrador de paquetes para una sola herramienta), pero en general es mucho más fácil de instalar tree y otros paquetes de software.


Instalación desde la fuente

En primer lugar, debe instalar las herramientas de línea de comandos de Xcode ejecutando xcode-select --install.

Entonces, descargar el tree fuente. Entonces cambia el Makefile para que funcione, que también se explica en la respuesta de @ apuche a continuación. Comentando las opciones de Linux y eliminando las opciones de OS X debería ser suficiente.

Entonces corre ./configure, entonces make.

Ahora tienes que 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 edita tu ~/.bash_profile para incluir:

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

Recarga el caparazón y ahora which tree debe apuntar a /usr/local/bin/tree.


Con un administrador de paquetes

Hay varios gestores de paquetes para OS X. Los más populares son: Homebrew, MacPorts, o Soplón (ordenado en el orden que recomendaría). Instale cualquiera de los primeros, solo instale uno, no todo.

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 administradores de paquetes ofrecen otros programas de línea de comandos, incluidos los de GNU / Linux que no vienen con OS X de forma predeterminada.


371



@slhck: ¡Gracias! Instalación Homebrew + brew install tree trabajado como un encanto :) - Misha Moroshko
@DavidMoles Porque simplemente corriendo make en OS X no funciona. En primer lugar, 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 descubrirá que se equivoca en un símbolo indefinido. Entonces debe hacer algunos ajustes en el archivo MAKE (como se explica aquí) Demasiada molestia IMO. - slhck
@ 7stud Muchas personas conocen algunas herramientas de línea de comandos para tareas de CLI muy simples, y pueden no saber cómo compilar software A veces las personas luchan por entender qué ./configure y make exactamente hacer y por qué esos son necesarios en primer lugar. O no quieren lidiar con eso. O lea cualquier archivo de ayuda, para el caso. Prefieren hacer algo como apt-get install. Está bien si prefieres las instalaciones desde la fuente (y personalmente yo también), pero debes aceptar que hay soluciones que otros perciben más fácilmente, o tal vez incluso la mayoría de los usuarios normales de computadoras. - slhck
A veces las personas luchan por comprender qué ./configure y hacen exactamente, y por qué se necesitan en primer lugar.  He estado instalando software de la fuente durante 15 años, y no tengo idea de qué ./configure y make hacer. Solo sé que son pasos que debo realizar para instalar el software. Leo a ciegas los archivos README e INSTALL, y hago lo que dice. - 7stud
@DhruvGhulati No es que yo sepa, pero podrías invertir-grep eso. Me gusta tree | grep -v 'json' o similar. - slhck


No es exactamente lo mismo, pero una manera rápida en la Mac es:

find .

y eso es. Enumerará todas las rutas de archivos en el directorio actual como una lista.


25



Si está interesado en un directorio en particular: encuentre ./ <dir_name> - raspacorp
Si solo está interesado en los archivos, find . -type f - Jared Beck
Solo estaba interesado en recorrer algunos niveles para mostrar la estructura del directorio find . -type d -maxdepth 2 trabajó para mi - Matthew Lock
Mejor uso find * si no quieres ver archivos y directorios ocultos. tree no muestra los archivos y directorios ocultos de forma predeterminada. - asmaier


No hay una formal tree comando 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 

18



Pierde todas las opciones de tree, pero sigue siendo una buena solución. - slhck
@slhck jeje, fue una solución de hack rápida ... - Ahmed Masud
Sin embargo, es posible que desee citar sus variables. - slhck
@JenS. por supuesto, simplemente puede cambiar el comando de búsqueda para hacer frente a ese - Ahmed Masud
genio, me encanta. - xaphod


Probablemente deberías estar usando homebrew. Si lo haces:

brew install tree

18



Estaba a punto de responder con esto. Buen espectaculo. - alfonso
Sugerencia simple pero potente. Gracias. - Gearon


O si su administrador no le deja instalar cualquiera de los brew, fink, port herramientas que siempre puedes construir 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

Edite Makefile para comentar la parte de linux y descomente 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

Opcional: Forzar salida de color

Y mientras lo hace, si quiere obligar a Tree a colorear siempre el resultado, siempre puede editar el main método de la tree.c archivar y agregar force_color=TRUE; antes de setLocale(LC_TYPE,"");

Finalmente golpear make y ya terminaste de construir tree para Mac.

El tributo va a Shaun Chapman por su publicación original en su blog.


16



No se pudo acceder al sitio web de Shaun; Gracias por la información al modificar el Makefile. - Paul Nathan
Específicamente, puedes agregar force_color = TRUE;. No hay punto y coma y obtienes un error de compilación. - tgrosinger
Acabo de construir la versión 1.7 y en lugar de setLocale sus setlocale. Entonces en tree.c, usted busca setlocale(LC_TYPE,""); ¡y gracias! - Avi Cohen
Gran respuesta. ¿Puedes agregar una nota sobre cómo moverlo a /bin (o algún camino para que pueda ser usado globalmente)? - Khanh Nguyen
FYI, compilando 1.7.0 bajo Yosemite obtuve: warning: format specifies type 'long' but the argument has type 'long long'. La solución era cambiar un especificador de formato de %9ld a %9lld. - David Moles


Una alternativa que usa find y awk:

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

5





Agregar un pequeño punto a @ respuesta de apuche para OSX El Capitan desarraigado característica. make install falla ya que no se nos permite escribir en /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, simplemente edite Makefile tener prefix = /usr/local


3



Bueno, esto técnicamente funciona. Pero es invasivo. Entonces probablemente puedas correr ./configure --prefix=/usr/local antes de correr make y make install y obtendría los mismos resultados. - JakeGould
@JakeGould Absolutamente, uso prefix en tales escenarios Pero no hay configure archivo en la última versión de árbol (1.7.0) ahora. los INSTALL archivo en el directorio descomprimido solo dice usar make y make install inmediatamente. - vikas027


Agregué lo siguiente a ~ / .bash_profile para usar en Terminal.app. Se incluyen algunos comentarios para ayudar a recordar cómo se está utilizando el hallazgo.

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

2





Aquí hay una solución de script de 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

Podrías modificar el meta = … línea para extraer diferentes metadatos para mostrar, seleccionando a mano las piezas divididas en la siguiente línea. Con un poco más de trabajo, podría pasar argumentos ls arbitrarios para seleccionar los metadatos que se mostrarán.

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

2



¡Muchas gracias por la solución liviana! En OSX 10.9.5 (Running stock Ruby 2.0.0), debido a un error de 'no conversión implícita de verdadero en String (TypeError)', tuve que cambiar la sexta línea del método #tree para leer file = File.basename (ruta) + (File.directory?(path)? '/': '') - joel.neely