Comando Linux para imprimir la estructura de directorios en forma de árbol

510

¿Hay algún comando de Linux que pueda llamar desde un script Bash que imprima la estructura de directorios en forma de árbol, por ejemplo,

folder1
   a.txt
   b.txt
folder2
   folder3
usuario243655
fuente
77
Solo corre find. O find . -not -path '*/\.*'para ocultar archivos y carpetas que comienzan con .. Si desea tener salida con espacios, como en la pregunta, úsela con este script "buscar 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]"
usuario
11
¿No deberían migrarse tales preguntas a SuperUser en lugar de cerrarse?
Balmipour
12
No creo que esta pregunta merezca ser cerrada como "fuera de tema". Las etiquetas parecen estar en lo cierto.
Sanket Berde
14
La política de cerrar preguntas sin migrar es perjudicial tanto para stackoverflow como para el conocimiento humano en general. En los últimos 3 días, todas las preguntas que busqué en Google y que encontré se cerraron por un razonamiento similar, y no se pudieron realizar más actividades. Esto significa que nadie puede actualizarlo, nadie puede dar una mejor respuesta, y hace que stackoverflow parezca miope o elitista. Stackoverflow debería considerar requerir una migración cuando se encuentra que un tema tiene estas condiciones.
No
55
Estoy de acuerdo con @NickYeates. Estoy aquí a fines de septiembre de 2017 y aún encuentro respuestas a esta misma pregunta. ¡Piense a largo plazo cuando diseñamos estas políticas de preguntas y respuestas!
Alex

Respuestas:

774

¿Es esto lo que estás buscando árbol ? Debería estar en la mayoría de las distribuciones (tal vez como una instalación 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

muestra tomada de la página web del mantenedor.

Puede agregar la opción -L #donde #se reemplaza por un número, para especificar la profundidad máxima de recursión.

Eliminar -dpara mostrar también los archivos.

astuto
fuente
54
Nota para cualquier visitante que vea esto: ¡eliminar -dpara mostrar archivos también!
Después
29
Nota para cualquier visitante de ver esto: la página del manual listas de un camión cargado de más banderas para ti :)
oivvio
43
Para instalar en Mac OS X con Homebrew: brew install tree
funfuntime
2
Para instalar en cygwin apt-cyg install tree(suponiendo que haya instalado apt-cyg)
blockloop
2
Ni siquiera Ubuntu 16.04 viene con esto. El uso apt-get install treelo instalará.
Romeo Sierra
331

Puedes usar este:

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

Mostrará una representación gráfica de los subdirectorios actuales sin archivos en unos segundos , por ejemplo, en /var/cache/:

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

Fuente

Soufiane Hassou
fuente
77
Si lo desea con espacios, más como el OP solicitado, entonces esto: ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// /g' -e 's/^/ /'
Ben
¿De alguna manera puedo hacer que esto ignore los archivos de puntos? Por ejemplo, evitar que enumere el contenido de .git?
GMA
@GeorgeMillo ver mi comentario
usuario
32
No imprime archivos.
Tomáš Zato - Restablece a Mónica el
36
con archivos: find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
JavaSheriff
18

Para agregar la solución de Hassou a su .bashrc, intente:

alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/   /'"'"' -e '"'"'s/-/|/'"'"
RussellStewart
fuente
66
Tenga cuidado con el carácter de nueva línea al final de la primera línea si copia esto directamente
Rahul
2
Buen alias. Pero falta '' (2 caracteres de comillas simples) al final. Funciona incluso sin él, pero ... si desea agregar algunos comandos más al final, verá que el literal no está completo. Así que debería ir alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/ /'"'"' -e '"'"'s/-/|/'"'"''
Hero Qu
7

Este comando funciona para mostrar carpetas y archivos .

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

Salida de ejemplo:

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

Fuente: Comentario de @javasheriff aquí . Está sumergido como un comentario y publicarlo como respuesta ayuda a los usuarios a detectarlo fácilmente.

Pavan Kumar
fuente
para python3 encontré que find . |grep -vE 'pyc|swp|__init' | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"funcionaba bien
patroqueeet
3

Estoy embelleciendo la salida de la respuesta de @ Hassou con:

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

Esto es muy parecido a la salida de treeahora:

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

También puedes hacer un alias:

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

Por cierto, treeno está disponible en algún entorno, como MinGW. Entonces la alternativa es útil.

Robert
fuente
gitbash en windows no le gusta la última expresión, dice que no está terminada
Leos Literak