Como posso ordenar du -h output por tamanho

844

Eu preciso de uma lista de resultados legíveis para humanos.

No entanto, du não tem uma opção "classificar por tamanho", e canalizar para sort não funciona com o sinalizador legível.

Por exemplo, executando:

du | sort -n -r 

Exibe um uso de disco classificado por tamanho (decrescente):

du |sort -n -r
65108   .
61508   ./dir3
2056    ./dir4
1032    ./dir1
508     ./dir2

No entanto, executá-lo com o sinalizador legível por humanos não é classificado corretamente:

du -h | sort -n -r

508K    ./dir2
64M     .
61M     ./dir3
2.1M    ./dir4
1.1M    ./dir1

Alguém sabe de uma maneira de classificar du -h por tamanho?

    
por Tom Feiner 25.02.2009 / 13:42

38 respostas

0

Aqui está minha solução, um script bash simples que só chama du de uma vez e mostra apenas diretórios de tamanho 1 MB ou maior:

#!/bin/env bash
# Usage: my_du.sh [subdirectory levels]
#   For efficiency, only calls "du" once, and stores results in a temp file
#   Stephen Becker, 2/23/2010

if [ $# -gt 0 ]; then
# You may prefer, as I do, to just summarize the contents of a directory
# and not view the size of its subdirectories, so use this:
    du -h --max-depth $1 > temp_du_file
else
    du -h > temp_du_file
fi


# Show all directories of size > 1 GB:
cat temp_du_file | grep "^\([0-9]\|\.\)\+G" | sort -nr
# Show all directories of size > 1 MB:
cat temp_du_file | grep "^\([0-9]\|\.\)\+M" | sort -nr

rm temp_du_file
    
por 23.02.2010 / 18:43
0

Por que não jogar outro chapéu no ringue ... é uma questão antiga, mas aqui está um exemplo que é (principalmente) puro shell script (fwiw) - ou seja, apenas bash e não perl / python / awk / etc . Então, nesse sentido, talvez ofereça algo novo para a discussão (ou não). Ele calcula o tamanho do arquivo apenas uma vez, mas imprime em várias unidades (minha preferência). (A versão não simplificada inclui getopts que excluem "GB" se indesejados.)

#!/bin/bash

printf -- ' %9s %9s %9s       %-30s\n' 'K'        'M'        'G'        'Path'
printf -- ' %9s %9s %9s       %-30s\n' '--------' '--------' '--------' '-----------'
du -sk "$@" | while read val; do
    file=$(echo "$val" | cut -f2-)
    size_k=$(echo "$val"  | cut -f1)
    printf ' %9s %9s %9s       %-30s\n' \
          ${size_k}  \
          $(( size_k / 1024 ))  \
          $(( size_k / 1024 / 1024 ))  \
          "$file"
  done | sort -n
    
por 25.06.2012 / 07:14
0

du -s * | sort -nr | cut -f2 | xargs du -sh

    
por 05.07.2012 / 07:06
0

Este é o alias que eu tenho no meu .profile

alias du='sudo du -xh --max-depth=1 | sort -h'

classifique -h é o que realmente ajuda aqui para a pergunta feita.

Outras opções úteis são du -x para permanecer no mesmo sistema de arquivos; também o sudo ajuda a não ver erros se houver diretórios que não sejam legíveis pelo mundo. Além disso, eu sempre faço du --max-depth = 1, depois detalho, etc.

    
por 24.02.2016 / 23:04
0

Classifica em ordem decrescente.

du -s ./* | sort -n| cut -f 2-| xargs du -sh {}
    
por 10.09.2016 / 15:01
0

Aqui está um exemplo

du -h /folder/subfolder --max-depth=1 | sort -hr

Retorna:

233M    /folder/subfolder
190M    /folder/subfolder/myfolder1
15M     /folder/subfolder/myfolder4
6.4M    /folder/subfolder/myfolder5
4.2M    /folder/subfolder/myfolder3
3.8M    /folder/subfolder/myfolder2

Você também pode adicionar | head -10 para encontrar o top 10 ou qualquer número de subpastas no diretório especificado.

    
por 23.08.2018 / 17:02
0

Vagamente baseado na lógica em este verso , escrevi um script que fornece um arquivo legível para leitura humana (1) saída. Além de exigir o sinalizador -h para legibilidade humana, ele não requer outros comandos não compatíveis com POSIX.

Ele está disponível no link .

    
por 26.10.2018 / 22:09
-1

Em vez de violar du e amigos, você pode usar ls sozinho para fazer o que quiser:

ls -1Ssh

Isso imprimirá todos os arquivos classificados por tamanho, escritos em formato legível. A primeira linha impressa é o total, se você quiser se livrar dela, você pode simplesmente usar

ls -1Ssh | tail -n +2

Você pode adicionar o -r flag a ls se quiser os arquivos na ordem inversa (do menor para o maior).

    
por 02.09.2009 / 20:30