Comando Linux para imprimir a estrutura de diretórios na forma de uma árvore

510

Existe algum comando linux que eu possa chamar de um script Bash que imprima a estrutura de diretórios na forma de uma árvore, por exemplo,

folder1
   a.txt
   b.txt
folder2
   folder3
user243655
fonte
7
Apenas corra find. Ou find . -not -path '*/\.*'para ocultar arquivos e pastas começando com .. Se você deseja obter uma saída com espaços, como na pergunta, use-a com o script "find prettifier":find . -not -path '*/\.*' | python -c "import sys as s;s.a=[];[setattr(s,'a',list(filter(lambda p: c.startswith(p+'/'),s.a)))or (s.stdout.write(' '*len(s.a)+c[len(s.a[-1])+1 if s.a else 0:])or True) and s.a.append(c[:-1]) for c in s.stdin]"
user
11
Essas perguntas não deveriam ser migradas para o SuperUser e não fechadas?
Balmipour
12
Eu não acho que essa questão merece ser encerrada como "fora de tópico". As tags parecem estar corretas.
Sanket Berde 01/12/19
14
A política de fechar perguntas sem migrar é prejudicial ao fluxo de pilha e ao conhecimento humano em geral. Nos últimos três dias, todas as perguntas que encontrei no Google foram encerradas por um raciocínio semelhante, e nenhuma atividade foi possível. Isso significa que ninguém pode atualizá-lo, ninguém pode dar uma resposta melhor e faz com que o fluxo de pilha pareça míope ou elitista. O Stackoverflow deve considerar exigir uma migração quando for encontrado um tópico com essas condições.
Nay
5
Concordo com @NickYeates Estou aqui no final de setembro de 2017 ainda encontrando respostas para essa mesma pergunta. Pense a longo prazo quando projetamos essas políticas de perguntas e respostas!
Alex

Respostas:

774

É isso que você está procurando em árvore ? Deve estar na maioria das distribuições (talvez como uma instalação opcional).

~> tree -d /proc/self/
/proc/self/
|-- attr
|-- cwd -> /proc
|-- fd
|   `-- 3 -> /proc/15589/fd
|-- fdinfo
|-- net
|   |-- dev_snmp6
|   |-- netfilter
|   |-- rpc
|   |   |-- auth.rpcsec.context
|   |   |-- auth.rpcsec.init
|   |   |-- auth.unix.gid
|   |   |-- auth.unix.ip
|   |   |-- nfs4.idtoname
|   |   |-- nfs4.nametoid
|   |   |-- nfsd.export
|   |   `-- nfsd.fh
|   `-- stat
|-- root -> /
`-- task
    `-- 15589
        |-- attr
        |-- cwd -> /proc
        |-- fd
        | `-- 3 -> /proc/15589/task/15589/fd
        |-- fdinfo
        `-- root -> /

27 directories

amostra retirada da página da web do mantenedor.

Você pode adicionar a opção -L #onde #é substituído por um número, para especificar a profundidade máxima da recursão.

Remover -dpara exibir também os arquivos.

astuto
fonte
54
Nota para qualquer visitante que esteja vendo isso: remova -dpara exibir arquivos também!
Afr
29
Nota para qualquer visitante de ver este: As listas de páginas homem um caminhão de mais bandeiras para você :)
OIVVIO
43
Para instalar no Mac OS X com Homebrew: brew install tree
funfuntime
2
Para instalar em cygwin apt-cyg install tree(supondo que você tenha instalado apt-Cyg)
blockloop
2
Nem o Ubuntu 16.04 vem com isso. Use apt-get install treeirá instalá-lo.
Romeo Sierra
331

Você pode usar este:

ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'

Ele mostrará uma representação gráfica dos subdiretórios atuais sem arquivos em alguns segundos , por exemplo, em /var/cache/:

   .
   |-apache2
   |---mod_cache_disk
   |-apparmor
   |-apt
   |---archives
   |-----partial
   |-apt-xapian-index
   |---index.1
   |-dbconfig-common
   |---backups
   |-debconf

Fonte

Soufiane Hassou
fonte
7
Se você quiser espaços, mais como o OP solicitado, então: ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// /g' -e 's/^/ /'
Ben
de alguma forma eu posso fazer isso ignorar dotfiles? Por exemplo, impedi-lo de listar o conteúdo de .git?
GMA
@GeorgeMillo ver meu comentário
user
32
Não imprime arquivos.
Tomáš Zato - Reinstate Monica
36
com arquivos: find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
JavaSheriff
18

Para adicionar a solução de Hassou ao seu .bashrc, tente:

alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/   /'"'"' -e '"'"'s/-/|/'"'"
RussellStewart
fonte
6
Cuidado com o caractere de nova linha no final da primeira linha se copiar isso diretamente
Rahul
2
Bom apelido. Mas está faltando '' (2 caracteres de aspas simples) no final. Funciona mesmo sem ele, mas ... se você quiser adicionar mais alguns comandos no final, verá que o literal não está completo. Por isso deve ir alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/ /'"'"' -e '"'"'s/-/|/'"'"''
Hero Qu
7

Este comando funciona para exibir pastas e arquivos .

find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"

Exemplo de saída:

.
 |-trace.pcap
 |-parent
 | |-chdir1
 | | |-file1.txt
 | |-chdir2
 | | |-file2.txt
 | | |-file3.sh
 |-tmp
 | |-json-c-0.11-4.el7_0.x86_64.rpm

Fonte: Comentário de @javasheriff aqui . Ele é submerso como um comentário e publicado como resposta ajuda os usuários a identificá-lo facilmente.

Pavan Kumar
fonte
para python3 eu achei que find . |grep -vE 'pyc|swp|__init' | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"funcionava bem
patroqueeet
3

Estou prettifying a saída da resposta de @ Hassou com:

ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//──/g' -e 's/─/├/' -e '$s/├/└/'

Isso é muito parecido com o resultado do treeagora:

.
├─pkcs11
├─pki
├───ca-trust
├─────extracted
├───────java
├───────openssl
├───────pem
├─────source
├───────anchors
├─profile.d
└─ssh

Você também pode criar um alias:

alias ltree=$'ls -R | grep ":$" | sed -e \'s/:$//\' -e \'s/[^-][^\/]*\//──/g\' -e \'s/─/├/\' -e \'$s/├/└/\''

BTW, treenão está disponível em alguns ambientes, como MinGW. Portanto, a alternativa é útil.

Robert
fonte
gitbash no Windows não gosta da última expressão, ele diz que não é finalizado.
Leos Literak
2

Você também pode usar a combinação dos comandos find e awk para imprimir a árvore de diretórios. Para obter detalhes, consulte " Como imprimir uma estrutura de diretório em árvore multinível usando os comandos combinados linux find e awk "

find . -type d | awk -F'/' '{ 
depth=3;
offset=2;
str="|  ";
path="";
if(NF >= 2 && NF < depth + offset) {
    while(offset < NF) {
        path = path "|  ";
        offset ++;
    }
    print path "|-- "$NF;
}}'
ylspirit
fonte