Mac OS X equivalente ao comando "árvore" do Ubuntu

Respostas:

438

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

brew install tree

Continue lendo para obter detalhes.


Com um gerenciador de pacotes

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

Siga as instruções no site e execute um dos seguintes comandos, dependendo do gerenciador de pacotes que 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 do GNU / Linux que não vêm com o macOS por padrão.

Instalando a partir da Origem

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

Em seguida, baixe a treefonte . Em seguida, mudar o Makefile para fazê-lo funcionar , o que também é explicado em resposta de @ apuche abaixo . Comentar as opções do Linux e descomentar as opções do macOS deve ser suficiente.

Então corra ./configure, então make.

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

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

Agora edite seu ~/.bash_profilepara incluir:

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

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

slhck
fonte
shaunchapmanblog.com/post/329270449/… também parece ter instruções detalhadas, mas pode causar problemas com o llvm-gcc vivendo em / Developer se você estiver executando o Xcode 4.x; um pouco de brincadeira deve fazer o truque.
Ahmed Masud
1
@DavidMoles Porque simplesmente rodar makeno OS X não funciona. Primeiro, você precisa saber como instalar as ferramentas de linha de comando do Xcode (ou, geralmente, ter alguma idéia sobre a criação de software) e, em seguida, descobrirá que há erros em um símbolo indefinido. Então você precisa fazer alguns ajustes no makefile (como explicado aqui ). IMO muito aborrecido.
slhck
3
@ 7stud Muitas pessoas conhecem algumas ferramentas de linha de comando para tarefas CLI muito simples e podem não saber como compilar software. Às vezes, as pessoas lutam para entender o que ./configuree makeexatamente fazem e por que essas são necessárias em primeiro lugar. Ou eles não querem lidar com isso. Ou leia todos os arquivos de ajuda. Eles preferem fazer algo assim apt-get install. Tudo bem se você preferir instalações da fonte (e eu também pessoalmente), mas você deve aceitar que existem soluções que são percebidas mais facilmente por outras pessoas, ou talvez até pela maioria dos usuários normais de computador.
Slhck
1
As pessoas às vezes se esforçam para entender o que ./configure e fazer exatamente fazer e por aqueles que são necessários em primeiro lugar eu tenho vindo a instalar software de fonte por 15 anos, e eu não tenho idéia do que ./configuree makefazer. Só sei que são etapas que preciso executar para instalar o software. Li cegamente os arquivos README e INSTALL e faço o que diz.
7stud
1
@DhruvGhulati Não que eu saiba, mas você poderia fazer inversão grep. Gosto tree | grep -v 'json'ou similar.
Slhck 4/08/16
33

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

find .

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

nopole
fonte
Se estiver interessado em um diretório específico: encontrar ./ <dir_name>
raspacorp
Se apenas interessado em arquivos,find . -type f
Jared Beck
2
Eu só estava interessado em ir a alguns níveis de profundidade para mostrar a estrutura de diretórios de modo find . -type d -maxdepth 2funcionou para mim
Matthew Bloqueio
Melhor uso find *se você não quiser ver arquivos e diretórios ocultos. treenão mostra arquivos e diretórios ocultos por padrão.
Asmaier 31/05/19
findé uma ferramenta 万金油.
Evan Hu
22

Ou se o administrador não vai deixar você instalar qualquer um dos brew, fink, portferramentas que você sempre pode construí-lo 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 parte do linux e descomentar a área 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: Forçando a saída colorida

E enquanto você está nisso, se você deseja forçar a árvore a sempre colorir a saída, sempre pode editar o mainmétodo do tree.carquivo e adicioná-lo force_color=TRUE;antessetLocale(LC_TYPE,"");

Finalmente clique makee você está pronto treepara construir para o mac.

Homenagem vai para Shaun Chapman por seu post original em seu blog.

apouche
fonte
Não foi possível acessar o site de Shaun; obrigado pela atenção em modificar o Makefile.
Paul Nathan
Especificamente, você pode adicionar force_color = TRUE;. Sem ponto e vírgula e você recebe um erro de compilação.
tgrosinger
1
Acabei de criar a versão 1.7 e não a setLocalesua setlocale. Então tree.c, você procura setlocale(LC_TYPE,""); e obrigado!
Avi Cohen
Ótima resposta. Você pode adicionar uma observação sobre como movê-lo para /bin(ou algum caminho para que possa ser usado globalmente)?
Khanh Nguyen 10/10
FYI, compilando 1.7.0 sob Yosemite eu tenho: warning: format specifies type 'long' but the argument has type 'long long'. A correção foi alterar um especificador de formato de %9ldpara %9lld.
David Moles
21

Você provavelmente deveria estar usando homebrew . Se você fizer:

brew install tree
nichochar
fonte
18

Não existe um treecomando formal em si, no entanto, 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 
Ahmed Masud
fonte
Ele perde todas as opções de tree, mas ainda é uma pequena e agradável solução.
slhck
@slhck hehe era uma solução corte rápido ...
Ahmed Masud
Você pode querer citar suas variáveis.
precisa
$ x deve ser $ dirlist não deve ser citado ... por causa da expansão especial de "$ @"
Ahmed Masud
1
@JenS. Claro que você pode simplesmente mudar o comando find para lidar com isso
Ahmed Masud
5

Uma alternativa usando finde awk:

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

Encontrei uma solução simples aqui: http://murphymac.com/tree-command-for-mac/

Assim, adicionando o seguinte ao seu .bashrc, .bash_profileou em qualquer outro lugar vai fazer o trabalho:

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

Agora, adicionar um treecomando será impresso assim:

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

Adicionando um pequeno ponto à resposta do @ apuche para o recurso sem raiz OSX El Capitan . make installfalha, pois não temos permissão para gravar no /usr/bindiretório.

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 Makefilea terprefix = /usr/local

vikas027
fonte
Bem, isso tecnicamente funciona. Mas é invasivo. Portanto, você provavelmente poderia executar ./configure --prefix=/usr/localantes da execução makee make installobteria os mesmos resultados.
precisa saber é o seguinte
2
@JakeGould Absolutamente, eu uso prefixem tais cenários. Mas não há nenhum configurearquivo na versão mais recente da árvore (1.7.0) agora. O INSTALLarquivo no diretório descompactado apenas diz para usar makee make installimediatamente.
precisa saber é
2

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
l --marc l
fonte
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 meta = …linha para extrair diferentes metadados a serem exibidos, escolhendo manualmente as partes divididas na próxima linha. Com um pouco mais de trabalho, você pode passar argumentos ls arbitrários para selecionar os metadados a serem exibidos.

Saída de amostra (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
Phrogz
fonte
2
Muito obrigado pela solução leve! No OSX 10.9.5 (executando o Ruby 2.0.0), devido a um erro 'sem conversão implícita de true em String (TypeError)', tive que alterar a sexta linha do método #tree para ler file = File.basename (path) + (File.directory?(path)? '/': '')
joel.neely
1

Não é tão bonito quanto a árvore gnu ... mas é realmente fácil criar um 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'
Eddie B
fonte
1
  1. Instalar o Xcode

  2. Obter ferramentas de linha de comando

xcode-select --install
  1. Instalar Homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  1. Instalar árvore
brew install tree
KunMing Xie
fonte
1
Já mencionado em duas respostas anteriores em 2011 e 2016. Precisamos de uma terceira resposta dizendo o mesmo?
Jason S
0

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

Esta é a 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'
}

Simplesmente adicione a função a /Users/foo/.profileou .bash_profilee atualize o perfil com: source .profileou:source .bash_profile

marshki
fonte