tamanhos “legíveis por humanos” com ls -sh no FreeBSD

1

Com o GNU ls , é possível obter tamanhos de arquivo "legíveis por humanos" (isso significa que sufixos como K, M, G, ... para Kilo-, Mega- e Gigabyte etc. são anexados e o número é mantido abaixo de 1024 ) com a opção -h mesmo se não usado em conjunto com -l mas somente com -s .

Como se pode obter esse comportamento com o ls que vem com o FreeBSD, ou seja, como se consegue que ls -sh funcione no FreeBSD?

    
por wolf-revo-cats 10.08.2016 / 13:31

2 respostas

2

A maneira de responder isso é ler o código-fonte:

Nenhum erro será reportado se -h for fornecido sem nenhuma dessas opções.

O FreeBSD adicionou a opção em 2001 , bem antes da (muito antiga) userland no OSX . As páginas de manual do FreeBSD e OSX possuem descrições idênticas de -h (e "ls -lh" funciona para ambos). Mas nesse ponto, só funcionou com -l :

Add a new flag, -h which when combined with the -l option causes file sizes to be displayed with unit suffixes; Byte, Kilobyte, Megabyte, Gigabyte, Terabyte and Petabyte in order to reduce the number of digits to three or less.

    
por 11.08.2016 / 02:03
1

Se você quiser os recursos GNU ls no FreeBSD, você pode instalar o pacote gnuls e o alias ls to gnuls .

Se você quiser se ater ao software básico, é possível pós-processar a saída de ls . (Script repostado de como você classifica du output por tamanho? ) Isso funciona em qualquer sistema POSIX.

CLICOLOR_FORCE=1 ls | awk '
    function human(x) {
        s="kMGTEPYZ";
        while (x>=1000 && length(s)>1)
            {x/=1024; s=substr(s,2)}
        return int(x+0.5) substr(s,1,1)
    }
    {gsub(/^[0-9]+/, human($1)); print}'

CLICOLOR_FORCE faz com que o BSD ls use cores, mesmo que não esteja gravando em um terminal. Por outro lado, como ls não está gravando em um terminal, você receberá um arquivo por linha em vez de colunas. No FreeBSD, você pode usar a opção -C para obter colunas, mas o script de pós-processamento torna-se muito mais complexo, já que precisa encontrar tamanhos no meio da linha. Tente isto (não testado):

CLICOLOR_FORCE=1 ls -C | awk '
    function human(x) {
        s="kMGTEPYZ";
        while (x>=1000 && length(s)>1)
            {x/=1024; s=substr(s,2)}
        return int(x+0.5) substr(s,1,1)
    }
    {gsub(/(^|  )[0-9]+/, human($1)); print}'
    
por 15.08.2016 / 21:53

Tags