Mac OS X equivalente del comando "árbol" de Ubuntu

Respuestas:

438

También puede obtener el treecomando en macOS. Si tiene Homebrew , todo lo que necesita hacer es ejecutar:

brew install tree

Sigue leyendo para más detalles.


Con un administrador de paquetes

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.

Instalando desde la fuente

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

Luego, descargue la treefuente . 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 treearchivo 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_profilepara incluir:

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

Vuelva a cargar el shell, y ahora which treedebería señalar /usr/local/bin/tree.

slhck
fuente
shaunchapmanblog.com/post/329270449/… también parece tener instrucciones detalladas, pero puede causar problemas con llvm-gcc living under / Developer si está ejecutando Xcode 4.x; un poco de juguetear debería ser suficiente.
Ahmed Masud
1
@DavidMoles Porque simplemente ejecutar makeen 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.
slhck
3
@ 7stud Muchas personas conocen algunas herramientas de línea de comandos para tareas CLI muy simples, y es posible que no sepan cómo compilar software. Las personas a veces luchan por comprender qué ./configurey makeexactamente 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.
slhck
1
La gente a veces dificultades para entender lo que ./configure y hacer exactamente lo hacen y por qué los que se necesitan en primer lugar he estado instalando software de la fuente durante 15 años, y no tengo ni idea de qué ./configurey makehacer. Solo sé que son pasos que debo realizar para instalar el software. Leí ciegamente los archivos README e INSTALL, y hago lo que dice.
7stud
1
@DhruvGhulati No que yo sepa, pero podrías invertirlo grep. Me gusta tree | grep -v 'json'o similar.
slhck
33

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.

nopole
fuente
Si está interesado en un directorio en particular: encuentre ./ <dir_name>
raspacorp
Si solo le interesan los archivos,find . -type f
Jared Beck
2
Solo estaba interesado en profundizar algunos niveles para mostrar la estructura del directorio, así que find . -type d -maxdepth 2funcionó para mí
Matthew Lock
Mejor uso find *si no desea ver archivos y directorios ocultos. treeno muestra archivos y directorios ocultos por defecto.
asmaier
findes una herramienta 万金油.
Evan Hu
22

O si el administrador no le permitirá instalar cualquiera de los brew, fink, portherramientas 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

Opcional: forzar salida de color

Y mientras lo hace, si desea forzar al árbol para que siempre coloree la salida, siempre puede editar el mainmétodo del tree.carchivo y agregarlo force_color=TRUE;antessetLocale(LC_TYPE,"");

Finalmente presiona makey has terminado treede compilar para mac.

Homenaje a Shaun Chapman por su publicación original en su blog.

apouche
fuente
No se pudo acceder al sitio web de Shaun; gracias por el aviso de modificar el Makefile.
Paul Nathan
Específicamente, puedes agregar force_color = TRUE;. Sin punto y coma y obtienes un error de compilación.
tgrosinger
1
Acabo de construir la versión 1.7 y en lugar de setLocalesu setlocale. Entonces tree.c, buscas setlocale(LC_TYPE,""); ¡y gracias!
Avi Cohen
Gran respuesta. ¿Puedes agregar una nota sobre cómo moverlo /bin(o alguna ruta para que pueda usarse globalmente)?
Khanh Nguyen
Para su información, la compilación 1.7.0 bajo Yosemite llegué: warning: format specifies type 'long' but the argument has type 'long long'. La solución fue cambiar un especificador de formato de %9lda %9lld.
David Moles
21

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

brew install tree
Nichochar
fuente
18

No hay un treecomando 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 
Ahmed Masud
fuente
Echa de menos todas las opciones tree, pero sigue siendo una buena solución.
slhck
@slhck jeje, fue una solución rápida de pirateo ...
Ahmed Masud
Sin embargo, es posible que desee citar sus variables.
slhck
$ x debería ser $ dirlist no debería ser citado ... debido a la expansión especial de "$ @"
Ahmed Masud
1
@JenS. por supuesto, simplemente puede cambiar el comando de búsqueda para lidiar con eso
Ahmed Masud
5

Una alternativa usando findy awk:

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

Encontré una solución simple aquí: http://murphymac.com/tree-command-for-mac/

Por lo tanto, agregar lo siguiente a su .bashrc, .bash_profileo cualquier otro lugar hará que funcione:

alias tree="find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'"

Ahora agregar un treecomando se imprimirá así:

# ~/my-html-app [13:03:45]$ tree
.
|____app.js
|____css
| |____main.css
| |____theme.css
|____index.html
Shashank Agrawal
fuente
3

Agregando un pequeño punto a la respuesta de @ apuche para la función sin raíz OSX El Capitan . make installfalla ya que no podemos escribir en el /usr/bindirectorio.

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 Makefilepara tenerprefix = /usr/local

vikas027
fuente
Bueno, esto técnicamente funciona. Pero es invasivo. Por lo tanto, probablemente podría ejecutar ./configure --prefix=/usr/localantes de ejecutar makey make installobtendría los mismos resultados.
JakeGould
2
@JakeGould Absolutamente, lo uso prefixen tales escenarios. Pero no hay ningún configurearchivo en la última versión del árbol (1.7.0) ahora. El INSTALLarchivo en el directorio descomprimido solo dice usar makey de make installinmediato.
vikas027
2

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
l --marc l
fuente
2

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
Phrogz
fuente
2
¡Muchas gracias por la solución ligera! En OSX 10.9.5 (ejecutando stock Ruby 2.0.0), debido a un error '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
1

No es tan bonito como el árbol gnu ... pero es realmente fácil usar alias en bash ... Incluso puedes agregar un poco de color al agregar la opción G al color ls de osx.

alias tree='find . -type d | ls -lARG'
Eddie B
fuente
1
  1. Instalar Xcode

  2. Obtener herramientas de línea de comandos

xcode-select --install
  1. Instalar Homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  1. Instalar árbol
brew install tree
KunMing Xie
fuente
1
Ya se mencionó en dos respuestas anteriores en 2011 y 2016. ¿Necesitamos una tercera respuesta que diga lo mismo?
Jason S
0

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/.profileo .bash_profile, luego actualice el perfil con: source .profileo:source .bash_profile

marshki
fuente