Mac OS X equivalente ao comando "árvore" Ubuntu
Existe um equivalente ao comando Ubuntu tree
para Mac OS X?
Existe um equivalente ao comando Ubuntu tree
para Mac OS X?
Você também pode obter o comando tree
no MacOS. Se tiver Homebrew , só precisa de correr:
brew install tree
Leia para mais detalhes.
Existem vários gestores 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 destes ao mesmo tempo!
Siga as instruções no site, depois execute um dos seguintes comandos, dependendo do gerenciador de pacotes que você escolher.
Para Homebrew:
brew install tree
Para MacPorts:
sudo port install tree
Para Fink:
fink install tree
Os gerenciadores de pacotes oferecem outros programas de linha de comando, incluindo os programas GNU/Linux que não vêm com macOS por padrão.
Primeiro, você tem que instalar as ferramentas de linha de comando Xcode executando xcode-select --install
.
Depois, baixe o código fonte tree
. Depois mude o Makefile para que funcione , o que também é explicado na resposta de @apuche abaixo . Comentando as opções Linux e descomentando as opções MacOS deverá ser suficiente.
Depois, execute ./configure
, depois make
.
Agora tem de mover o ficheiro binário tree
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 o seu ~/.bash_profile
para incluir:
export PATH="/usr/local/bin:$PATH"
Recarregar a shell, e agora o which tree
deve apontar para /usr/local/bin/tree
.
Não exactamente o mesmo, mas uma maneira rápida no Mac é:
find .
e é isso. Ele irá listar todos os caminhos de arquivos no diretório atual como uma lista.
Ou se o seu administrador não o deixar instalar nenhuma das ferramentas brew
, fink
, port
, main
pode sempre construí-la 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
Editar o Makefile para comentar a parte 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
E enquanto está a fazê-lo, se quiser forçar a árvore a colorir sempre a saída, pode sempre editar o método tree.c
do ficheiro force_color=TRUE;
e adicionar setLocale(LC_TYPE,"");
antes de make
Finalmente, clique em tree
e está pronto a construir &007 para mac.
Tribute vai para Shaun Chapman para o seu post original no seu blog.
Não existe um comando formal tree
em si, no entanto pode fazê-lo:
Guardar o seguinte script para /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
Alterar as permissões para que possa executá-lo:
chmod 755 /usr/local/bin/tree
Claro que poderá ter de criar /usr/local/bin
:
sudo mkdir -p /usr/local/bin/tree
Encontrei aqui uma solução simples: http://murphymac.com/tree-command-for-mac/
Então adicionar o seguinte ao seu .bashrc
, .bash_profile
ou qualquer outro lugar vai fazer funcionar:
alias tree="find . -print | sed -e 's;[^/]*/;| ____;g;s;____ |; |;g'"
Agora adicionar um comando tree
vai imprimir assim:
# ~/my-html-app [13:03:45]$ tree
.
| ____ app.js
| ____ css
| | ____ main.css
| | ____ theme.css
| ____ index.html
Adicionando um pequeno ponto à resposta de @apuche para a funcionalidade rootless do OSX El Capitan. make install
falha uma vez que não nos é permitido escrever no directó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 ultrapassar isto, basta editar Makefile
para ter prefix = /usr/local
Aqui está uma solução de script Ruby que produz uma bela árvore Unicode juntamente 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
Pode modificar a linha meta = …
para extrair diferentes metadados a apresentar, escolhendo à mão as peças divididas na linha seguinte. Com um pouco mais de trabalho poderia passar argumentos arbitrários de ls para seleccionar os metadados a mostrar.
Saída de amostra (parece mais agradável 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
Eu adicionei o seguinte ao ~/.bash_profile para utilização em Terminal.app. Alguns comentários são incluídos para ajudar a lembrar como o find está a ser utilizado.
##########
## 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 directório actual
$> tree
exemplo para algum caminho
$> tree /some/path
Instalar Xcode
Obter ferramentas de linha de comando
xcode-select --install
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install tree
Atrasado no jogo, mas eu tinha a mesma pergunta. Devido a restrições no local de trabalho, não consegui instalar um pacote a partir da fonte ou através de um gestor 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'
}
Basta adicionar a função a /Users/foo/.profile
ou .bash_profile
, depois actualizar o perfil com: source .profile
ou: source .bash_profile