Como imprimir em formato legível humano em KB, MB, GB em vez de K, M, G?

0

Eu tenho um widget na minha área de trabalho que mostra o tamanho atual dos arquivos em minha lixeira. O código para o widget é o seguinte:

du -ch ~/.Trash | grep total | cut -c 1-5

Isso me dará algo como: '99M'. Mas eu gostaria de exibir '99 MB 'em vez disso (e KB, GB respectivamente). Você poderia me ajudar a substituir o código com a string correta para obter esse resultado (observe também o espaço entre '99' e 'MB')? Obrigado antecipadamente!

PS: eu uso o Mac OS X 10.11.6.

    
por Philipp L. 06.08.2017 / 22:00

4 respostas

0
  1. Acho que, quando o tamanho está entre 10 K e 99 K (digamos, por exemplo, 42 K), os primeiros cinco caracteres da saída são

            4    2    K    (tab)    /

    (assumindo que o argumento do nome do caminho começa com / - qual será, se você estiver especificando um argumento que comece com ~ ). Então essa será a saída de cut -c 1-5 : 42K     / . (Eu presumo que nnM e nnG terá o mesmo problema.) Faz mais sentido usar cut -f1 para obter o primeiro campo da saída, em vez dos cinco primeiros caracteres.

  2. O que acontece se você tiver um nome de diretório que inclua a palavra total ? Dica: ele passará pelo grep . Em vez de ter df , gere os dados para cada subdiretório, e depois ter grep jogando fora, Faz mais sentido ter df gerando apenas o total. Como RomanPerekhrest aponta , você pode fazer isso especificando a opção -s .
  3. Como dmgnx aponta , depois que você tiver o número (terminando com K , M ou G ), tudo que você precisa fazer é anexar o B . Então, minha solução composta é

    echo "$(du -sh ~/.Trash | cut -f1)B"
    
  4. Oops! Eu não notei que você queria adicionar um espaço entre o número e as unidades. OK, então você precisa de sed (ou algo similar):

    du -sh ~/.Trash | cut -f1 | sed 's/[KMG]$/ &B/'
    

    ou talvez apenas

    du -sh ~/.Trash | sed 's/^\([0-9.]*\)\([KMG]\).*$/ B/'
    

    (usando sed para descartar o nome do diretório, e eliminando o cut ao todo).

por 06.08.2017 / 22:50
2

Use a opção -s ( --summarize ) para exibir apenas um valor de tamanho total:

du -sh | sed 's/^\([0-9]*\)\([^B]\).*/ B/'
  • ([0-9]*\) - capturando o valor do tamanho total

  • ([^B]\) - capturando valor reduzido da unidade, exceto B (bytes, que permanece como está)

por 06.08.2017 / 22:12
1

Você pode limpar os espaços em branco à direita com tr e colocar o 'B' em um comando echo:

echo "$(du -ch ~ | grep total | cut -c 1-5 | tr -d '[:blank:]')B" | sed 's/\(K\|M\|G\)B/ B/'

Ou apenas sed it:)

du -ch ~ | grep total | cut -c 1-5 | sed 's/\s\+$/B/' | sed 's/\(K\|M\|G\)B/ B/'

editar 0: Não percebeu o espaço antes da unidade, adicionou o último sed para fazer o trabalho

    
por 06.08.2017 / 22:06
0

Brute à força:

du -ch ~/.Trash | grep total | cut -c 1-5 | 
  sed -e 's/K$/ KB/; s/M$/ MB/; s/G$/ GB/'
    
por 06.08.2017 / 22:06

Tags