combina o melhor de 'du' e 'tree'

15

Gostaria de saber se podemos combinar a honestidade de 'du' com a formatação recuada de 'árvore'. Se eu quiser uma listagem dos tamanhos dos diretórios:

du -hx -d2

... exibe dois níveis de profundidade e todos os resumos de tamanho são honestos, mas não há indentação de subdiretórios. Por outro lado:

tree --du -shaC -L 2

... recuos e cores bem, no entanto, os tamanhos relatados são uma mentira. Para obter os tamanhos reais, é preciso:

tree --du -shaC

... o que significa dizer que você só obtém os tamanhos verdadeiros se permitir que 'árvore' mostre toda a estrutura do diretório. Eu gostaria de poder ter sempre resumos de tamanho corretos, independentemente de quantos níveis de subdiretórios eu realmente quero exibir. Eu costumo fazer isso:

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

... que remove tudo, exceto diretórios, e os recorta bem ... mas não há uma maneira fácil de limitar a exibição a apenas um determinado número de níveis (sem os resumos mentindo). Há algum caminho? Talvez eu tenha perdido os interruptores corretos ...

    
por Ray Andrews 25.10.2015 / 02:39

4 respostas

5

Também faça o checkout ncdu : link

Sua página também lista outros "projetos semelhantes":

gt5 - Quite similar to ncdu, but a different approach.

tdu - Another small ncurses-based disk usage visualization utility.

TreeSize - GTK, using a treeview.

Baobab - GTK, using pie-charts, a treeview and a treemap. Comes with GNOME.

GdMap - GTK, with a treemap display.

Filelight - KDE, using pie-charts.

KDirStat - KDE, with a treemap display.

QDiskUsage - Qt, using pie-charts.

xdiskusage - FLTK, with a treemap display.

fsv - 3D visualization.

Philesight - Web-based clone of Filelight.

    
por 04.11.2015 / 00:47
8

Você não precisa grep para o código de cor, a opção -d é list directories only .

Isso parece fazer o que você quer:

$ 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

O comando grep remove todas as linhas que têm (um ou mais espaços seguidos por um não espaço seguido por um espaço) duas vezes, seguidas por um [ .

Se você quiser uma profundidade de 1, altere a contagem limite dentro das chaves {} para {1} em vez de {2} . mesmo se você quiser uma profundidade de 3, mude para {3} .

Você pode transformar isso em uma função shell, assim:

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
}

Isso usa getopts para "roubar" qualquer opção -L e seu argumento da linha de comando tree , se houver. Se não houver uma opção -L n na linha de comando, isso também funciona.

Todas as outras opções e argumentos são passados para o comando tree .

A linha local PATTERN=... não é realmente necessária. Eu só fiz isso para ter certeza de que caberia em uma linha e não em quebra de linha aqui em U&L . A expressão regular poderia e provavelmente deveria ir diretamente na linha tree | grep ... .

Execute assim:

mytreedu 

ou

mytreedu -L 2 /path/to/dir/
    
por 25.10.2015 / 03:21
0

Inspirado por cas, agora estou fazendo isso:

treee ()
{
    integer levels=$(( ($1 + 1) * 4 ))
    tree --du -shaC | grep "\[01;34m" | grep -Ev "^[^\[]{$levels}\[*"
    du -sh .
}
    
por 25.10.2015 / 18:13
0

Você pode usar dutand

  • saída colorida, de acordo com a variável de ambiente LS_COLORS.
  • exibe a árvore do sistema de arquivos
  • capacidade de agregar arquivos pequenos
  • capacidade de excluir arquivos ou diretórios
  • capacidade de comparar diretórios diferentes
  • rápido, escrito em Rust
por 01.11.2018 / 02:26