Creando árboles

Una de las cosas por las que se suele trabajar en un ambiente gráfico es por la utilidad de la interfaz para presentar la estructura de directorios de manera que pueda abarcarse fácilmente la mayor parte de ésta y su contenido. Esto es algo que se extraña cuando uno debe trabajar desde la línea de comandos, a través de un emulador de terminal.

Sin embargo, una presentación arbórea de la estructura de directorios puede ser lograda con el entubamiento de algunos comandos, por ejemplo:

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

que permite obtener algo como:

/Applications> ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e ' 
 |-Address Book.app
 |---Contents
 |-----MacOS
 |-----Resources
 |-------AddressBook.help
 |---------Contents
 |-----------Resources
 |-------------Dutch.lproj
 |---------------pgs
 |---------------sty
 |---------------xpgs
 |-------------English.lproj
 |---------------pgs
 |---------------sty
 |---------------xpgs
 |-------------French.lproj
...

Una presentación mucho más pulida puede ser obtenida con

find . -type d -print 2>/dev/null | awk '!/\.$/ {for( i=1;i<NF;i++ ){d=(d<3&&i!=1)?3:length($i); printf("%"d"s","|")}print "---"$NF}' FS='/'

Stuart Franklin, Reserva Forestal de Kepong. Coronas de árboles “Kapur” (Dryobalanops aromatica) Malaysia 1997.

y que permite obtener algo como:

/Applications> tf("%"d"s","|")}print "---"$NF}' FS='/'
|---.install4j<
|---Address Book.app
|  |---Contents
|  |       |---_CodeSignature
|  |       |---MacOS
|  |       |---Resources
|  |       |        |---AddressBook.help
|  |       |        |               |---Contents
|  |       |        |               |       |---Resources
|  |       |        |               |       |        |---da.lproj
|  |       |        |               |       |        |       |---pgs
|  |       |        |               |       |        |       |---sty
|  |       |        |               |       |        |       |---xpgs
|  |       |        |               |       |        |---Dutch.lproj
|  |       |        |               |       |        |          |---pgs
|  |       |        |               |       |        |          |---sty
|  |       |        |               |       |        |          |---xpgs
|  |       |        |               |       |        |---English.lproj
|  |       |        |               |       |        |            |---pgs
|  |       |        |               |       |        |            |---sty
|  |       |        |               |       |        |            |---xpgs
|  |       |        |               |       |        |---fi.lproj
|  |       |        |               |       |        |       |---pgs
|  |       |        |               |       |        |       |---sty
|  |       |        |               |       |        |       |---xpgs
|  |       |        |               |       |        |---French.lproj
|  |       |        |               |       |        |           |---pgs
|  |       |        |               |       |        |           |---sty
|  |       |        |               |       |        |           |---xpgs
|  |       |        |               |       |        |---German.lproj
|  |       |        |               |       |        |           |---pgs
|  |       |        |               |       |        |           |---sty
|  |       |        |               |       |        |           |---xpgs
...

Si la indentación (el valor de d en el script AWK) resulta demasiado excesiva, puede usarse la siguiente versión del comando:

find . -type d -print 2>/dev/null | awk '!/\.$/ {for( i=1;i<NF;i++ ){d=3; printf("%"d"s","|")}print "--"$NF}' FS='/'

El funcionamiento de estos comando puede variar de versión a versión de Unix. Yo lo he podido probar usando el shell Korn y Bourne en HP-UX, así como su versión para Mac OS X 10.5 y 10.6, donde también se ha podido validar con los shells Z y BASH.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s