Questão Equivalente ao Mac OS X do comando “árvore” do Ubuntu


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


265


origem




Respostas:


Sim, existe e é chamado tree.

Você pode instalá-lo

  • da fonte ou
  • com um gerenciador de pacotes

O primeiro pode parecer um pouco complicado se você nunca compilou o código fonte antes. Requer edição de alguns arquivos. O último tem um pouco de sobrecarga (porque você pode não precisar de um gerenciador de pacotes para apenas uma ferramenta), mas geralmente é muito mais fácil de instalar tree e outros pacotes de software.


Instalando da origem

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

Então, Faça o download do tree fonte. Então mudar o Makefile para fazê-lo funcionar, que também é explicado em @ apuche's answer abaixo. Comentar as opções do Linux e descomentar as opções do OS X deve ser suficiente.

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

Agora você tem que mover o tree arquivo binário para um local que está 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 incluir:

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

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


Com um gerenciador de pacotes

Existem vários gerenciadores de pacotes para o OS X. Os mais populares são: Homebrew, MacPortsou Fink (classificado na ordem que eu recomendaria). Instale qualquer um desses primeiro - basta instalar 1, não tudo.

Em seguida, 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 OS X por padrão.


371



@slhck: Obrigado! Instalando Homebrew + brew install tree funcionou como um encanto :) - Misha Moroshko
@DavidMoles Porque simplesmente rodando make no OS X não funciona. Primeiro, você precisa saber como instalar as ferramentas de linha de comando do Xcode (ou, em geral, ter alguma idéia sobre a criação de software) e, em seguida, descobrirá que ele comete erros em um símbolo indefinido. Então você tem que fazer alguns ajustes no makefile (como explicado Aqui). Demasiado incômodo IMO. - slhck
@ 7stud Muitas pessoas conhecem algumas ferramentas de linha de comando para tarefas de CLI muito simples, e podem não sabe como compilar software. As pessoas às vezes lutam para entender o que ./configure e make exatamente fazer e por que esses são necessários em primeiro lugar. Ou eles não querem lidar com isso. Ou leia todos os arquivos de ajuda, para esse assunto. Eles preferem fazer algo como apt-get install. Tudo bem se você preferir instalações da fonte (e eu pessoalmente também), mas você tem que aceitar que existem soluções que são percebidas mais facilmente pelos outros, ou talvez até a maioria dos usuários normais de computador. - slhck
As pessoas às vezes lutam para entender o que ./configure e fazer exatamente e por que essas são necessárias em primeiro lugar  Eu venho instalando software da fonte há 15 anos, e não tenho ideia do que ./configure e make Faz. Eu só sei que são passos que preciso executar para instalar o software. Eu leio cegamente os arquivos README e INSTALL, e faço o que ele diz. - 7stud
@DhruvGhulati Não que eu saiba, mas você poderia inverter-grep isto. Gostar tree | grep -v 'json' ou similar. - slhck


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.


25



Se estiver interessado em um diretório específico: localize ./ <dir_name> - raspacorp
Se apenas interessado em arquivos, find . -type f - Jared Beck
Eu só estava interessado em ir alguns níveis profundos para mostrar a estrutura de diretórios assim find . -type d -maxdepth 2 funcionou para mim - Matthew Lock
Melhor uso find * se você não quiser ver arquivos e diretórios ocultos. tree não mostra arquivos e diretórios ocultos por padrão. - asmaier


Não existe uma formal tree comando per se, 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 

18



Perde todas as opções de tree, mas ainda é uma boa solução. - slhck
@slhck hehe foi uma solução rápida de hack ... - Ahmed Masud
Você pode querer citar suas variáveis ​​embora. - slhck
@JenS é claro que você pode simplesmente mudar o comando find para lidar com isso - Ahmed Masud
gênio - ame isso. - xaphod


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

brew install tree

18



Eu estava prestes a responder com isso. Bom show. - alfonso
Sugestão simples, mas poderosa. Obrigado. - Gearon


Ou se o administrador não permitir que você instale qualquer um dos brew, fink, port ferramentas 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 descomente a área do 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 de cores

E enquanto você está nisso, se você quer forçar a árvore a sempre colorir a saída, você sempre pode editar main método do tree.c arquivar e adicionar force_color=TRUE; antes setLocale(LC_TYPE,"");

Finalmente atingido make e você acabou de construir tree para mac.

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


16



Não foi possível acessar o site de Shaun; obrigado pelo heads up 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
Acabei de criar a versão 1.7 e, em vez de setLocale Está setlocale. Então, em tree.c, você procura por setlocale(LC_TYPE,""); e obrigado! - Avi Cohen
Ótima resposta. Você pode adicionar uma nota sobre como movê-lo para /bin(ou algum caminho para que possa ser usado globalmente)? - Khanh Nguyen
FYI, compilando 1.7.0 sob Yosemite, recebi: warning: format specifies type 'long' but the argument has type 'long long'. A correção foi alterar um especificador de formato de %9ld para %9lld. - David Moles


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='/'

5





Adicionando um pequeno ponto para @ resposta de apuche para OSX El Capitan sem raízes característica. make install falhar uma vez que não estamos autorizados a escrever em /usr/bin diretó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 Makefile Ter prefix = /usr/local


3



Bem, isso tecnicamente funciona. Mas é invasivo. Então você provavelmente poderia correr ./configure --prefix=/usr/local antes de correr make e make install e alcançaria os mesmos resultados. - JakeGould
@JakeGould Absolutamente, eu uso prefix nesses cenários. Mas não há configure arquivo na versão mais recente do árvore (1.7.0) agora. o INSTALL arquivo no diretório descompactado apenas diz para usar make e make install imediatamente. - vikas027


Eu adicionei o seguinte para ~ / .bash_profile para uso no Terminal.app. Alguns comentários são incluídos para ajudar a lembrar como a localização 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

2