combina lo mejor de 'du' y 'tree'

21

Me pregunto si podemos combinar la honestidad de 'du' con el formato sangrado de 'tree'. Si quiero una lista de los tamaños de directorios:

du -hx -d2

... muestra dos niveles de profundidad y todos los resúmenes de tamaño son honestos, pero no hay sangría de subdirecciones. Por otra parte:

tree --du -shaC -L 2

... sangra y colorea muy bien, sin embargo, los tamaños reportados son una mentira. Para obtener los tamaños reales, uno debe:

tree --du -shaC

... lo que quiere decir que solo obtienes los tamaños verdaderos si dejas que 'tree' te muestre la estructura completa del directorio. Me gustaría poder tener siempre resúmenes de tamaño correctos independientemente de cuántos niveles de subdirecciones quiera mostrar realmente. A menudo hago esto:

tree -du -shaC | grep "\[01;34m"

... que elimina todo menos los directorios, y los sangra muy bien ... pero no hay una manera fácil de limitar la visualización a solo un determinado número de niveles (sin los resúmenes). ¿Hay alguna manera? Quizás he perdido los interruptores correctos ...

Ray Andrews
fuente

Respuestas:

8

También revisa ncdu : http://dev.yorhel.nl/ncdu

Su página también enumera otros "proyectos similares":

gt5: bastante similar a ncdu, pero con un enfoque diferente.

tdu: otra pequeña utilidad de visualización de uso de disco basada en ncurses.

TreeSize - GTK, usando una vista de árbol.

Baobab - GTK, utilizando gráficos circulares, una vista de árbol y un mapa de árbol. Viene con GNOME.

GdMap - GTK, con una visualización de mapa de árbol.

Filelight - KDE, utilizando gráficos circulares.

KDirStat - KDE, con una visualización de mapa de árbol.

QDiskUsage - Qt, usando gráficos circulares.

xdiskusage - FLTK, con una visualización de mapa de árbol.

fsv: visualización en 3D.

Philesight - Clon de Filelight basado en la web.

David Potočnik
fuente
1
Gracias David, finalmente pude mirarlos. Elegí ncdu.
Ray Andrews
@David, ¿de dónde viene tdu?
Shirish
@shirish Consulte mi fuente, mencionada anteriormente
David Potočnik el
11

No necesita grep para el código de color, la -dopción eslist directories only .

Esto parece hacer lo que quieres:

$ tree --du -d -shaC | grep -Ev '(  *[^ ]* ){2}\['
.
├── [  18]  dir1
├── [  30]  dir2
├── [ 205]  junk
│   ├── [  18]  dir1
│   ├── [  30]  dir2
│   └── [  76]  dir3
├── [ 119]  merge
└── [  20]  stuff

 4.4K used in 10 directories

El grepcomando elimina todas las líneas que tienen (uno o más espacios seguidos de un no espacio seguido de un espacio) dos veces, seguido de un[ .

Si desea una profundidad de 1, cambie el conteo encuadernado dentro de las {} llaves en {1}lugar de {2}. lo mismo si quieres una profundidad de 3, cámbiala a{3} .

Puede convertir esto en una función de shell, así:

mytreedu() {
  local depth=''

  while getopts "L:" opt ; do
      case "$opt" in
          L) depth="$OPTARG" ;;
      esac
  done

  shift "$((OPTIND-1))"

  if [ -z "$depth" ] ; then
      tree --du -d -shaC "$@"
  else   
      local PATTERN='(  *[^ ]* ){'"$depth"'}\['
      tree --du -d -shaC "$@" | grep -Ev "$PATTERN"
  fi
}

Esto usa getoptspara "robar" cualquier -Lopción y su argumento de la treelínea de comando, si hay una. Si no hay un-L n opción en la línea de comando, entonces eso también funciona.

Todas las demás opciones y argumentos se pasan al treecomando.

La local PATTERN=...línea no es realmente necesaria. Solo lo hice así para asegurarme de que encajaría en una línea y no de una sola palabra U&L. La expresión regular podría y probablemente debería ir directamente altree | grep ... línea.

Ejecútelo así:

mytreedu 

o

mytreedu -L 2 /path/to/dir/
cas
fuente
1
Me encanta el código, pero repita que no puede usar '-d' porque si lo hace, los resúmenes de tamaño son incorrectos, o al menos están aquí. El tamaño se informará siempre como '4096', que es el tamaño de la entrada para el directorio en sí, pero no el tamaño de todo su contenido.
Ray Andrews
... debería haber dicho '4096' para cada directorio en el directorio actual ... pero no obtienes los tamaños del directorio, incluidos sus archivos.
Ray Andrews
solo mencionaste -Lque era un problema, no lo mencionaste -den absoluto. Ahora que miro más de cerca los números informados, tree --duni los tree --du -dtamaños de los informes que de alguna manera se parecen a los informados por du.
cas
Señale que nada menos que una pantalla del 100% no le dará los tamaños correctos. Puede limitar a través de '-d' o '-L 2' o cualquier otra cosa: no se muestra, no se cuenta en el tamaño.
Ray Andrews
tree --duno parece dar tamaños correctos para directorios de todos modos, con o sin -do -L. No tengo idea de cuáles son los números, pero no están relacionados con los duinformes.
cas
3

Puedes usar dutree

ingrese la descripción de la imagen aquí

  • salida coloreada, de acuerdo con la variable de entorno LS_COLORS.
  • mostrar el árbol del sistema de archivos
  • capacidad de agregar archivos pequeños
  • capacidad de excluir archivos o directorios
  • capacidad de comparar diferentes directorios
  • rápido, escrito en óxido
nachoparker
fuente
1

No hay ninguna herramienta de comando perfecta para hacer esto, pero encontré dos formas que son cercanas.

  • muestra el tamaño de las carpetas y los archivos, pero no se muestra en modo de árbol.

    du -ah --max-depth=1 /var/log

  • se muestra en modo de árbol pero solo el tamaño de los archivos, las carpetas están en conteos

    tree -ah /var/log -L 1

Valiant Jiang
fuente
0

Inspirado por cas, ahora estoy haciendo esto:

treee ()
{
    integer levels=$(( ($1 + 1) * 4 ))
    tree --du -shaC | grep "\[01;34m" | grep -Ev "^[^\[]{$levels}\[*"
    du -sh .
}
Ray Andrews
fuente
si vas a tirar todas las cosas de getopts, al menos deberías tenerlas "$@"inmediatamente después del -shaC. de lo contrario, esa función está codificada para funcionar solo para el directorio actual.
cas
Una vez que hiciéramos que funcionara, iba a preguntarle sobre eso: por favor explique. Correcto sobre "$ @", por supuesto, pero hasta ahora solo lo uso en el directorio actual, así que aún no lo he notado. Todas estas cosas de 'getopts' son nuevas para mí, me gustaría saber qué estás pensando allí.
Ray Andrews
Una de las ventajas de usar getoptses que las opciones pueden aparecer en cualquier orden en la línea de comando. La versión inicial de la mytreefunción que escribí usaba "$ 1" al igual que la suya, por lo que el argumento de profundidad tenía que ser el primer argumento, y no era opcional. Decidí que no era lo suficientemente bueno, así que usé bash-builtin getoptspara procesar la -Lopción. Esto permitió que la -L nopción apareciera en cualquier lugar de la línea de comando. También permitió que fuera completamente opcional.
cas
Otra forma de verlo es que le getoptspermite escribir scripts que toman opciones y argumentos reales (en lugar de solo argumentos en posiciones codificadas como $ 1 $ 2 $ 3, etc.), al igual que la mayoría de los otros programas en su sistema. Y si usa el getoptprograma (tenga en cuenta que no tiene un s) del util-linuxpaquete, puede usar tanto las opciones cortas de una sola letra (por ejemplo -l) como las opciones largas (como --long) al igual que los programas GNU.
cas
Ah ... vuelve a mí ahora. Sí, en realidad lo usé una vez. Hay que echarle otro vistazo. Gracias.
Ray Andrews