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 ...

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.


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/

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

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


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 .
}

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.