combine o melhor de 'du' e 'tree'

21

Gostaria de saber se podemos combinar a honestidade de 'du' com a formatação recortada de 'tree'. Se eu quiser uma lista dos tamanhos de diretórios:

du -hx -d2

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

tree --du -shaC -L 2

... recuos e cores muito bem, no entanto, os tamanhos informados são uma mentira. Para obter os tamanhos reais, é necessário:

tree --du -shaC

... ou seja, você só obtém os tamanhos verdadeiros se você deixar 'tree' mostrar toda a estrutura de diretórios. Eu gostaria de poder sempre ter resumos de tamanho correto, independentemente de quantos níveis de subdiretórios eu realmente queira exibir. Costumo fazer isso:

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

... que remove tudo, exceto os diretórios, e os recua bem ... mas não há uma maneira fácil de limitar a exibição a apenas um determinado nível de número (sem os resumos). Há algum jeito? Talvez eu tenha perdido as opções corretas ...

Ray Andrews
fonte

Respostas:

8

Também verifique ncdu : http://dev.yorhel.nl/ncdu

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

gt5 - Muito parecido com o ncdu, mas com uma abordagem diferente.

tdu - Outro pequeno utilitário de visualização de uso de disco baseado em ncurses.

TreeSize - GTK, usando uma exibição em árvore.

Baobab - GTK, usando gráficos de pizza, uma árvore e um mapa da árvore. Vem com o GNOME.

GdMap - GTK, com uma exibição em mapa de árvore.

Filelight - KDE, usando gráficos de pizza.

KDirStat - KDE, com uma exibição de mapa em árvore.

QDiskUsage - Qt, usando gráficos de pizza.

xdiskusage - FLTK, com uma exibição de mapa em árvore.

fsv - visualização em 3D.

Philesight - clone baseado na Web do Filelight.

David Potočnik
fonte
1
Obrigado David, finalmente cheguei a olhar para eles. Eu escolhi ncdu.
Raio Andrews
@ David De onde vem o tdu?
shirish
@shirish Consulte a minha fonte, mencionada acima
David Potočnik
11

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

Isso parece fazer o que você deseja:

$ 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 grepcomando remove todas as linhas que possuem (um ou mais espaços seguidos por um não espaço seguido por um espaço) duas vezes, seguidos por a [.

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

Você pode transformar isso em uma função shell, da seguinte maneira:

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 getoptspara "roubar" qualquer -Lopção e seu argumento da treelinha de comando, se houver uma. Se não houver uma -L nopção na linha de comando, isso funcionará também.

Todas as outras opções e argumentos são passados ​​para o treecomando

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

Execute-o assim:

mytreedu 

ou

mytreedu -L 2 /path/to/dir/
cas
fonte
1
Adoro o código, mas repita que você não pode usar o '-d' porque, se o fizer, os resumos de tamanho estão incorretos ou pelo menos estão aqui. O tamanho será relatado sempre como '4096', que é o tamanho da entrada para o próprio diretório, mas não o tamanho de todo o seu conteúdo.
Ray Andrews
... deveria ter dito '4096' para cada diretório no diretório atual ... mas você não obtém o tamanho do diretório, incluindo os arquivos.
Ray Andrews
você mencionou apenas -Lcomo um problema, não mencionou -dnada. Agora que olho mais de perto os números relatados, tree --dunem os tree --du -dtamanhos dos relatórios que de alguma forma se assemelham aos relatados por du.
28515
Aponte que nada menos que uma tela de 100% não fornecerá tamanhos corretos. Você pode limitar via '-d' ou '-L 2' ou qualquer outra coisa - não é mostrado, não é contado no tamanho.
Ray Andrews
tree --duparece não fornecer tamanhos corretos para diretórios, com ou sem -dou -L. Não tenho idéia do que devem ser os números, mas eles não têm relação com os durelatórios.
cas
3

Você pode usar dutree

insira a descrição da imagem aqui

  • saída colorida, de acordo com a variável de ambiente LS_COLORS.
  • exibir 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
nachoparker
fonte
1

Não há nenhuma ferramenta de comando perfeita para fazer isso, mas eu encontrei duas maneiras próximas.

  • mostra o tamanho das pastas e dos arquivos, mas não é exibido no modo de árvore.

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

  • mostra no modo de árvore, mas apenas no tamanho dos arquivos, as pastas estão em contagem

    tree -ah /var/log -L 1

Valiant Jiang
fonte
0

Inspirado em cas, agora estou fazendo o seguinte:

treee ()
{
    integer levels=$(( ($1 + 1) * 4 ))
    tree --du -shaC | grep "\[01;34m" | grep -Ev "^[^\[]{$levels}\[*"
    du -sh .
}
Ray Andrews
fonte
se você vai jogar fora todas as coisas de getopts, pelo menos ainda deve ter "$@"imediatamente após o -shaC. caso contrário, essa função será codificada para funcionar apenas no diretório atual.
cas
Quando a coisa funcionasse, eu perguntaria a você sobre isso: por favor, elabore. Certo sobre "$ @", é claro, mas até agora eu só o uso no diretório atual, então ainda não percebi isso. Todas essas coisas de 'getopts' são novas para mim, eu gostaria de saber o que você está pensando lá.
Ray Andrews
Um dos benefícios do uso getoptsé que as opções podem aparecer em qualquer ordem na linha de comando. A versão inicial da mytreefunção que escrevi usava "$ 1", assim como a sua, portanto o argumento de profundidade tinha que ser o primeiro, e não era opcional. Decidi que não era bom o suficiente, então usei o bash-builtin getoptspara processar a -Lopção. Isso permitiu que a -L nopção aparecesse em qualquer lugar da linha de comando. Também permitiu que fosse completamente opcional.
cas
outra maneira de ver é que getoptspermite escrever scripts que usam opções e argumentos reais (em vez de apenas argumentos em posições codificadas como $ 1 $ 2 $ 3 etc), assim como a maioria dos outros programas em seu sistema. E se você usar o getoptprograma (observe que não há um s) do util-linuxpacote, poderá usar as opções curtas de uma letra (por exemplo -l) e as opções longas (como --long) como nos programas GNU.
cas
Ah ... isso volta para mim agora. Sim, eu realmente usei isso uma vez. Deve dar uma outra olhada nele. Obrigado.
Ray Andrews