Mac OS X equivalente ao comando “árvore” do Ubuntu

302

Existe um equivalente ao tree command do Ubuntu para o Mac OS X?

    
por Misha Moroshko 21.11.2011 / 11:38

13 respostas

421

Você também pode obter o comando tree no macOS. Se você tiver o Homebrew , tudo o que você precisa fazer é executar:

brew install tree

Leia mais para detalhes.

Com um gerenciador de pacotes

Existem vários gerenciadores de pacotes para macOS. Os mais populares são: Homebrew , MacPorts , ou Fink . Você pode instalar qualquer um, mas eu recomendo o Homebrew. Não instale mais de um desses ao mesmo tempo!

Siga as instruções no site e execute um dos seguintes comandos, dependendo de qual gerenciador de pacotes você escolheu.

Para Homebrew:

brew install tree

Para MacPorts:

sudo port install tree

Para o Fink:

fink install tree

Os gerenciadores de pacotes oferecem outros programas de linha de comando, incluindo os GNU / Linux que não vêm com o macOS por padrão.

Instalando a partir da fonte

Primeiro, você precisa instalar as ferramentas de linha de comando do Xcode executando xcode-select --install .

Depois, faça o download da tree source . Em seguida, altere o Makefile para que ele funcione , que também é explicado na @ apuche resposta abaixo . Comentar as opções do Linux e descomentar as opções do macOS deve ser suficiente.

Em seguida, execute ./configure e, em seguida, make .

Agora você precisa mover o arquivo binário tree para um local que esteja no caminho do executável. Por exemplo:

sudo mkdir -p /usr/local/bin
sudo cp tree /usr/local/bin/tree

Agora edite seu ~/.bash_profile para incluir:

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

Recarregue o shell e agora which tree deve apontar para /usr/local/bin/tree .

    
por 21.11.2011 / 11:52
30

Não é exatamente o mesmo, mas uma maneira rápida no Mac é:

find .

e é isso. Ele listará todos os caminhos de arquivos no diretório atual como uma lista.

    
por 02.05.2014 / 15:31
21

Você provavelmente deve estar usando o homebrew . Se você fizer:

brew install tree
    
por 30.06.2016 / 18:30
21

Ou, se o administrador não permitir que você instale nenhuma das ferramentas brew , fink , port , você poderá sempre criá-las a partir da fonte:

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 o Makefile para comentar a área linux e uncomment osx do linux:

# 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: forçando a saída de cores

E, se você quiser forçar a árvore a sempre colorir a saída, sempre poderá editar o método main do arquivo tree.c e adicionar force_color=TRUE; antes de setLocale(LC_TYPE,"");

Finalmente, clique em make e você acabou de criar tree para o mac.

O tributo vai para Shaun Chapman para seu post original em seu blog.

    
por 15.07.2012 / 01:09
18

Não existe um comando tree formal, mas você pode fazer isso:

Salve o seguinte script em / 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

Altere as permissões para poder executá-lo:

chmod 755 /usr/local/bin/tree 

Claro que você pode ter que criar /usr/local/bin :

sudo mkdir -p /usr/local/bin/tree 
    
por 21.11.2011 / 11:53
5

Uma alternativa usando find e awk :

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

Adicionando um pequeno ponto à resposta @ apuche para o OSX El Capitan sem raízes recurso. make install falha porque não podemos gravar no diretório /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 isso, basta editar Makefile para ter prefix = /usr/local

    
por 12.01.2016 / 04:16
3

Encontrei uma solução simples aqui: link

Portanto, adicionar o seguinte ao seu .bashrc , .bash_profile ou qualquer outro lugar fará com que funcione:

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

Agora, a adição de um comando tree será impressa assim:

# ~/my-html-app [13:03:45]$ tree
.
|____app.js
|____css
| |____main.css
| |____theme.css
|____index.html
    
por 09.10.2016 / 09:34
2

Eu adicionei o seguinte ao ~ / .bash_profile para uso no Terminal.app. Alguns comentários estão incluídos para ajudar a lembrar como a descoberta está sendo usada.

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

exemplo para o diretório atual

$> tree

exemplo para algum caminho

$> tree /some/path
    
por 05.06.2014 / 04:20
2

Aqui está uma solução de script Ruby que produz uma boa árvore Unicode junto com metadados úteis.

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

Você pode modificar a linha meta = … para extrair metadados diferentes para exibir, escolhendo manualmente os fragmentos na próxima linha. Com um pouco mais de trabalho, você poderia passar argumentos ls arbitrários para selecionar os metadados para mostrar.

Exemplo de saída (parece melhor no terminal OS X do que a fonte no 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
    
por 27.11.2014 / 20:19
1

Não é tão bonito quanto o gnu tree ... mas é bem fácil alias no bash ... Você pode até adicionar um pouco de cor colocando a opção G na cor ls do osx.

alias tree='find . -type d | ls -lARG'
    
por 08.06.2012 / 09:30
0

Tarde do jogo, mas eu fiz a mesma pergunta. Devido a restrições no local de trabalho, não consegui instalar um pacote a partir da origem ou através de um gerenciador de pacotes de terceiros.

Esta é minha implementação:

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

Basta adicionar a função a /Users/foo/.profile ou .bash_profile , em seguida, atualize o perfil com: source .profile ou: source .bash_profile

    
por 16.10.2017 / 16:50
0
  1. Instale o Xcode

  2. Obtenha ferramentas de linha de comando

xcode-select --install
  1. Instale o Homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  1. Instalar árvore
brew install tree
    
por 21.02.2017 / 09:29