Como eu armazeno o tamanho amigável de um arquivo em uma variável?

1

Basicamente, o que eu quero fazer é criar um script que produza todos os arquivos e seus tamanhos no diretório que tenha tamanho maior do que um valor limite (2,2 GB no meu caso). Eu tentei usar o comando stat como abaixo

a=$(stat -c '%s' example.txt)

mas isso armazenará o tamanho do arquivo em bytes. O que eu quero é armazenar e exibir o tamanho em formato legível (MB, GB). Eu também estava pensando em armazenar a saída de ls -lah e depois aparar o resultado para armazenar apenas nome e tamanho, mas isso parecia uma tarefa tediosa. Existe outra maneira de fazer isso além de armazenar o resultado em bytes e fazer operações aritméticas nele.

    
por Vandan Bhardwaj 19.11.2017 / 14:32

4 respostas

4

Como você já está usando ferramentas GNU, veja numfmt do GNU coreutils:

$ stat -c %s file
310776
$ stat -c '%s' file | numfmt --to=si
311K
$ stat -c '%s' file | numfmt --to=iec
304K
$ stat -c '%s' file | numfmt --to=iec-i
304Ki
$ stat -c '%s' file | numfmt --to=si --suffix=B
311KB

com ksh93 :

$ size=$(stat -c %s file)
$ printf "%#d %#i\n" "$size" "$size"
311k 304Ki

Ou se construído com o ls builtin (que você também pode obter como um utilitário autônomo no pacote ast-open ):

$ type ls
ls is a shell builtin version of /opt/ast/bin/ls
$ ls -Z '%#(size)d %#(size)i' file
311k 304Ki
    
por 20.11.2017 / 07:55
3

Não há necessidade de um script, apenas use du -d 0 -t 2200M -h /some/dir/name/* .

Exemplo. Use du para mostrar todos os arquivos em / bin maiores que 500K :

du -d 0 -t 500K -h /bin/*

Saída:

1.1M    /bin/bash
620K    /bin/btrfs
2.0M    /bin/busybox
1.6M    /bin/ksh93
788K    /bin/zsh

sort tem um -h complementar que classificará os itens acima por tamanho:

du -d 0 -t 500K -h /bin/* | sort -h

Saída:

620K    /bin/btrfs
788K    /bin/zsh
1.1M    /bin/bash
1.6M    /bin/ksh93
2.0M    /bin/busybox
    
por 20.11.2017 / 03:58
2

A pessoa gentil AQUI apresenta uma solução que deve ajudá-lo:

find . -type f -size +2G -exec ls -sh {} \; 2> /dev/null

dará a você o nome completo do caminho e o tamanho em formato legível, tudo bem ordenado.

Se você quiser 2.2G então find não irá lidar com o decimal, então você terá que fazer um pouco de matemática e usar (2048 + 205 =) 2253M

find . -type f -size +2253M -exec ls -sh {} \; 2> /dev/null

Você pode restringir a profundidade da pesquisa e o tamanho necessário com os parâmetros de find (consulte man find ) e usar awk para gerar suas colunas em um arquivo ou matriz.

Editar: -lh alterado para -sh e awk removidos de acordo com o aprimoramento @Olorin

    
por 19.11.2017 / 15:50
0
du -h example.txt|cut -f 1

( -h = legível por humanos )

Isto pressupõe que a sua ideia de "legibilidade humana" e a du ideia deste conceito é a mesma.

    
por 20.11.2017 / 11:30