Uma ferramenta padrão para converter uma contagem de bytes em KiB MiB humano etc; como du, ls1
Existe uma ferramenta padrão que converte uma contagem inteira de bytes em uma contagem legível por humanos do maior tamanho de unidade possível, mantendo o valor numérico entre 1,00 e 1023,99?
Eu tenho meu próprio script bash / awk, mas estou procurando uma ferramenta padrão , encontrada em muitas / muitas distros ... algo mais geralmente disponível e, idealmente, possui argumentos de linha de comando simples e / ou pode aceitar entrada canalizada.
Aqui estão alguns exemplos do tipo de saída que estou procurando.
Aqui está o script bytes-human (usado para a saída acima)
Atualizar Aqui está uma versão modificada do script de Gilles , conforme descrito em um comentário à resposta dele (modificado para se adequar à minha aparência preferida).
Parece que aqui temos uma nova standard toolna tomada :)
@Gowtham - seu desejo pode ter se tornado realidade! Veja minha resposta abaixo ou blog.frankleonhardt.com/2015/…
Observe que os dois últimos sufixos são trocados; um Yottabyte é realmente maior que um Zettabyte.
— ### staticfloat #
Não, não existe essa ferramenta padrão.
Desde o GNU coreutils 8.21 (fevereiro de 2013, ainda não presente em todas as distribuições), no Linux e Cygwin não incorporado, você pode usar numfmt. Ele não produz exatamente o mesmo formato de saída (a partir do coreutils 8.23, acho que você não pode obter 2 dígitos após os pontos decimais).
Muitas ferramentas GNU mais antigas podem produzir esse formato e a classificação GNU pode classificar números com unidades desde o coreutils 7.5 (agosto de 2009, tão presente nas modernas distribuições Linux não incorporadas).
Acho seu código um pouco complicado. Aqui está uma versão mais limpa do awk (o formato de saída não é exatamente idêntico):
( Enviado a partir de uma pergunta mais especializada )
Ok obrigado. Sobre o seu roteiro, eu basicamente gosto muito. Há algumas coisas que me chamaram a atenção: (1) var sdeveria estar liderando B. Além disso, essa string é facilmente alterada para notação binária IEC. (2) Ignora o intervalo 1000-1023 em favor de 1 <próximo tamanho> (facilmente alterado) (3) Não possui valores decimais (o que eu quero). Novamente, isso é facilmente alterado. Ao exibir duas casas decimais, o %fformato causa a round-uppara o <próximo tamanho> para os valores 1019-1023 ; mas não vale a pena uma solução alternativa. Publiquei uma versão modificada na minha resposta, para referência geral.
gnumfmt para usuários homebrew OSX usando coreutils
Para aqueles que desejam converter dunúmeros em formato legível por humanos, observe que pode ser necessário adicionar --block-size=1ao ducomando.
— pawamoy
A partir da versão v. 8.21, coreutilsInclui numfmt:
numfmtlê números em várias representações e reformata-os conforme solicitado.
O uso mais comum é converter números de / para representação humana .
Vários outros exemplos (incluindo filtragem, processamento de entrada / saída etc.) são apresentados AQUI .
Além disso, a partir de coreutilsv. 8.24, numfmtPode processar vários campos com especificações faixa de campo semelhantes cut, e suporta definir a precisão de saída com a --formatopção
O numfmt é uma ferramenta recém-adicionada ao pacote coreutils a partir do coreutils-8.21.
— Zama Ques 24/03
Agora, essa deve ser a resposta aceita.
Aqui está uma opção apenas para o bash, nenhum bcou qualquer outro não embutido, + formato decimal e unidades binárias.
Deve ter bom desempenho em qualquer versão do Bash existente (incluindo o BYS para Windows do MSYSGit).
Esta é a melhor resposta para minhas necessidades do bash. Infelizmente, é publicado 1/2 uma década após a data do OP, o que significa que levará um tempo para subir na lista de votações.
@ WinEunuuchs2Unix obrigado, fico feliz que tenha sido útil para você :) #
Esta é uma reescrita completa inspirada na versão modificada de Peter.O do script awk de Gilles.
Corrige o bug de Peter.O, onde ele procura uma sequência de> 1 caractere, onde ele deve procurar um> 4 caracteres. Devido a esse bug, seu código não funciona para unidades ZiB.
Remove a codificação muito feia de uma longa sequência de tamanhos de unidades separadas por espaço.
Adiciona opções de linha de comando para ativar / desativar o preenchimento.
Adiciona opções de linha de comando para passar da notação base-1024 (KiB) para base-1000 (KB).
Envolve tudo em uma função fácil de usar.
Coloco isso em domínio público e saúdo o uso generalizado.
Casos de teste (se você quiser ver a saída):
Existem alguns perlmódulos no CPAN: Format :: Human :: Bytes e Number :: Bytes :: Human , sendo o último um pouco mais completo:
NOTA: a função parse_bytes()foi adicionada na versão 0.09 (01/03/2013)
Via linux - Existe uma calculadora de linha de comando para cálculos de bytes? - Stack Overflow , eu descobri sobre as unidades GNU - embora sem exemplos na página SO; e como eu não o vi listado aqui, aqui está uma pequena nota sobre isso.
Primeiro, verifique se as unidades estão presentes:
Dado que são, faça uma conversão - printfespecificadores de formato são aceitos para formatar o resultado numérico:
Na verdade, existe um utilitário que faz exatamente isso. Eu sei porque fui eu quem o escreveu. Foi escrito para * BSD, mas você deve compilar no Linux se você tiver as bibliotecas BSD (que eu acredito que sejam comuns).
Acabei de lançar uma nova versão, postada aqui:
Chama-se hr e leva stdin (ou arquivos) e converte números para o formato legível por humanos de uma maneira que (agora) é exatamente igual a ls -h e assim por diante, e pode selecionar feeds individuais em linhas, escala unidades pré-dimensionadas (por exemplo, se estiverem em blocos de 512 bytes, convertê-las em Mb, etc.), ajuste o preenchimento das colunas e assim por diante.
Escrevi alguns anos atrás, porque achava que tentar escrever um shell script, embora intelectualmente interessante, também fosse uma loucura total.
Usando hr, por exemplo, você pode facilmente obter uma lista ordenada de tamanhos de diretório (que saem em unidades de 1 KB e precisam ser alteradas antes da conversão) com o seguinte:
du -d1 | classificar -n | hr -sK
Enquanto du produzirá a saída -h, a classificação não será classificada por ela. A adição de -h aos utilitários existentes é um caso clássico de não seguir a filosofia do unix: ter utilitários simples realizando tarefas definidas muito bem.
Aqui está uma maneira de fazê-lo quase puramente no bash, só precisa de 'bc' para a matemática de ponto flutuante.
Infelizmente, não consigo descobrir como obter precisão de duas casas decimais. Testado no Ubuntu 14.04.
A primeira resposta de @ don_crissti é boa, mas pode ser ainda mais curta usando Here Strings , por exemplo
se <<<não estiver disponível, você pode usar, por exemplo,
— craeckie
Existem ferramentas Python
Eu não vejo uma flag --binary :(, então você teria que usar python diretamente para representação binária:
Eu tive o mesmo problema e rapidamente criei uma solução simples usando awka log()função:
E a precisão perdida no uso de números flutuantes não é tão ruim, pois essa precisão será perdida de qualquer maneira.
— Bence Kiglics
Embora o formato de saída não corresponda exatamente às suas especificações, a conversão em si é facilmente realizada por uma ferramenta muito padrão (ou duas) . Os que eu me refiro são dce bc. Você pode obter um relatório segmentado alterando as radias de saída. Como isso:
... que imprime ...
Eu uso dcacima porque é um favorito pessoal, mas bcpode fazer o mesmo com sintaxe diferente e adere às mesmas regras de formato especificadas pelo POSIX, como:
Para bases maiores que 16, cada dígito deve ser escrito como um número decimal com vários dígitos. Cada dígito, exceto o dígito fracionário mais significativo, deve ser precedido por um único espaço . Para bases de 17 a 100, bcdeve escrever números decimais de dois dígitos; para bases de 101 a 1000, cadeias decimais de três dígitos e assim por diante. Por exemplo, o número decimal 1024 na base 25 seria escrito como:
e na base 125, como:
Solução curta e doce, apenas com casca:
Não mostra a poção decimal.
O let VAR=expressioné Korn-ish. Substitua VAR=$(( expression ))por Born-again-ish.
Esta solução apresenta uma tonelada de erro, pois o / 1024 sempre arredonda, tenho certeza que você não deseja arredondar 1,5 TiB para 2 TiB.
— 9133 Geoffrey
AFAIK não existe uma ferramenta padrão para a qual você pode passar texto e ele retorna um formulário legível por humanos. Você pode encontrar um pacote para realizar a tarefa mencionada para sua distribuição.
No entanto, não entendo por que você pode precisar dessa ferramenta. A maioria dos pacotes que fornecem uma saída relacionada geralmente possui uma opção -h ou equivalente para saída legível por humanos.
Para fins de entendimento: legível por humanos significa exatamente isso; legível por seres humanos. As várias unidades diferentes de tamanho mostradas pelas ferramentas mencionadas não se destinam a cálculos programáticos, para os quais a uniformidade das unidades é essencial. Trabalhar com bytes, que sempre são números inteiros, é a única maneira de o bash fazer aritmética com eles. Então ... calcular em bytes ... reportar em humano , por exemplo. "Você está prestes a excluir permanentemente 3 arquivos, totalizando 2,44 GiB. Continuar?"
Eu acho que isso deve fazer parte da sua pergunta. Parece-me que você resolveu o problema. Boa sorte.
— shellter 26/07/12
Um aplicativo comum é gerar números de bytes para classificação e converter em unidades legíveis por humanos após a classificação.