tree.sh

Nombre: tree.sh
Autor: Rick Boivie
Origen: http://www.tldp.org/LDP/abs/html/contributed-scripts.html#TREE
Lenguaje: bash
Licencia: GPL
Propósito: Muestra un árbol de directorios, y el tamaño de cada uno de estos. Puede indicarse la profundidad que debe recorrerse en el árbol

Código:

#!/bin/bash
#   tree.sh: Lista los directorios y subdirectorios de un nivel dado. También muestra su tamaño
#   Author: Rick Boivie
#   Modified: Manuel (quijote99)
#   version: 0.3
#   date: 27/04/2007
#   encoding: ISO-8859-1

NAME=${0##*/}
version="0.3"

isdigit() { [[ ${*//[0-9]/} ]] && return 1 || return 0 ; }

help() {
echo -e "$NAME - $version\n\E[1mNOMBRE\E[0m\n\t$NAME - Muestra un árbol de directorios \
\n\n\E[1mSINOPSIS\E[0m\n\t\E[1m$NAME\
\E[0m [\E[1m[directorio] [profundidad]\E[0m]\n\t\E[1m\n\E[1mDESCRIPCION\E[0m\n\t$NAME es una \
pequeña utilidad para mostrar un árbol de directorios.\n\tSi no recibe parámetros, mostrará el árbol \
completo del directorio\n\tactual. La profundiada debe ser un número entero de 1 en adelante\n\t\
(con una profundidad 0 no mostrará ningún árbol) y puede ser\n\tindicada antes o después del \
directorio. Junto a cada directorio\n\tse muestra el tamaño que este ocupa (en un formato \
legible por las personas).\n" ; exit 0
}

search () {
if [ "$1" != "$levels" ]; then
  while read dir; do
    if [ -d "$dir" ] ; then
    zz=0
    while [ "$zz" != "$1" ]; do
        echo -en "| "
let zz++
    done
    if [ -L "$dir" ] ; then
      echo -en "+--- \033[1;36m${dir}\033[0m" $(ls -l $dir | sed 's/^.*'$dir' //')
      echo -e " ($(du -shc $dir | cut -f1 | head -1))"
    else
      echo -en "+--- \033[1;34m${dir}\033[0m"
      echo -e " ($(du -shc "$dir" | cut -f1 | head -1))"
      numdirs=$(expr $numdirs + 1)
      if cd "$dir" ; then
search $(expr "$1" + 1)
        cd ..
      fi
    fi
    fi
  done <<< "$(ls -1)"
fi
}

levels=-1
numdirs=0

while (($#)); do
if isdigit "$1"; then
levels="$1"; shift
elif [[ "$1" == "--help" ]]; then
help
elif ! [ -d $1 ]; then
echo -e "$NAME: \E[1mError:\E[0m el directorio $1 no existe"
exit 1
else cd "$1"; shift
fi
done

echo "Directorio Inicial = $(pwd)"
search 0
echo "Directorios Totales = $numdirs"

exit 0

Ejemplos de uso:

$tree.sh /usr 1
Directorio Inicial = /usr
+--- bin( 246M )
+--- games( 65M )
+--- include( 66M )
+--- lib( 1,8G )
+--- lib64( 5,0M )
+--- local( 111M )
+--- man( 12K )
+--- sbin( 30M )
+--- share( 1,6G )
+--- src( 155M )
+--- X11R6( 28K )
Directorios Totales = 11

$tree.sh /usr/share/games/ 2
Directorio Inicial = /usr/share/games
+--- castle-combat( 2,8M )
| +--- data( 2,5M )
| +--- scripts( 316K )
+--- eboard( 236K )
+--- frozen-bubble( 34M )
| +--- data( 360K )
| +--- gfx( 26M )
| +--- snd( 7,9M )
+--- fruit( 500K )
+--- goody( 22M )
| +--- data1( 6,8M )
| +--- data2( 2,5M )
+--- ketm( 8,7M )
+--- kobo-deluxe( 732K )
| +--- gfx( 392K )
| +--- sfx( 336K )
+--- mazeofgalious( 12M )
| +--- graphics( 2,9M )
| +--- rooms( 1,3M )
| +--- sound( 7,5M )
+--- xboard( 1,4M )
| +--- bitmaps.xchess( 1,4M )
+--- xmame( 16K )
| +--- artwork( 4,0K )
| +--- roms( 4,0K )
| +--- samples( 4,0K )
+--- xmess( 21M )
| +--- bios( 4,0K )
| +--- hash( 21M )
| +--- software( 4,0K )
Directorios Totales = 30

Comentarios: He modificado el script original para que muestre el tamaño de los directorios e indicar una profundidad máxima en el árbol. Si no se indicase directorio, utiliza el actual. La profundidad puede indicarse antes o después de la ruta, si se omite, mostrará el árbol completo. Estaré encantado de recibir sugerencias y críticas.