Como descobrir quantos bits um arquivo possui em um comando?


9

Eu sei que posso usar ls -latpara descobrir quantos bytes tem um arquivo e multiplicar por 8 para descobrir quantos bits. Mas isso é possível em apenas uma linha de comando?


5
Acho que não. Eu também não vejo qualquer utilidade prática para um recurso como esse ^^
— Martin von Wittich

1
@MartinvonWittich - velocidades de internet são muitas vezes feito em ' pedaços por segundo' ...
— Wilf

4
@ wilf: menos protocolo de sobrecarga.
— Ignacio Vazquez-Abrams

No meu caso, estou usando este naipe: csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html e o parâmetro é o número de bits que quero analisar.
— Felipe

Respostas:


15

Com o GNU du:

du -b FILE | awk '{ print $1, "* 8" }' | bc

9
Exceto ele não precisa bc- awkpode fazer a matemática em si:du -b FILE | awk '{print $1 * 8}
— aragaer

Veja também wc -c < FILEpara um equivalente portátil (para arquivos não-regulares, que tem o efeito colateral de lê-las, embora)
— Stéphane Chazelas

5

Uma solução shell + GNU coreutils:

echo $(( 8 * $(stat -c%s FILE) ))

A -c%sopção de statretornar apenas o tamanho do arquivo em bytes, eliminando a necessidade de processamento de texto adicional. Essa sintaxe é suportada pelo GNU coreutils e, portanto, deve funcionar na maioria das distribuições linux.

Como uma exceção no linux, se alguém estiver executando o zsh com o módulo zsh / stat opcional, será necessário especificar um caminho para obter os coreutils do GNU:

echo $(( 8 * $(command stat -c%s FILE) ))

@StephaneChazelas Obrigado pela informação. Resposta atualizada.
— precisa saber é o seguinte

Parece uma boa explicação, obrigado. No entanto, no meu teste, esse comando retornou para mim: title: 7: expressão matemática incorreta: operando esperado em `% s '] 2; eco 4096000 ---- a resposta é 4096000, mas quais são os outros erros?
— Felipe

@FelipeMicaroniLalli Não consigo reproduzir esse erro e não vejo nenhuma circunstância que (a) dê essa mensagem de erro e, ao mesmo tempo, (b) dê a resposta numérica correta. Curioso.
— precisa saber é o seguinte

3

Com o GNU find(antecede o GNU há statdécadas):

find file -prune -printf '%s*8\n' | bc

Relativamente portável:

ls -ld -- "$file" | awk '{print $5*8;exit}'

3

É possível em uma linha, porque você pode colocar vários comandos em uma linha, por exemplo, conectados por tubos ou substituições de comandos:

echo $(stat -c %s FILE) '* 8' | bc

(Obrigado @frostschutz pela atualização).


Funcionou como um encanto para mim. ➜ tmp stat arquivo-aleatório-3 | sed -n 's / Tamanho: ([0-9] *). * / \ 1 * 8 / p' | bc ➜ 4096000
— Felipe

Não funcionará em locais que não sejam em inglês ou em sistemas que não sejam GNU ou para um arquivo chamado ZSize: 5por exemplo
— Stéphane Chazelas

1
que tal stat -c %s FILEimprimir tamanho diretamente, em vez de sed?
— frostschutz

2

Único arquivo:

wc -c yourfile | awk '{print $1*8}'

Arquivos múltiplos:

wc -c yourfile1 yourfile2 | awk '{$1*=8; print $0}'

Este também funciona para um único arquivo. Não é completamente à prova de balas, veja o comentário de Stephane .

Estes são comandos compatíveis com o padrão POSIX.


Ótimo. Impressionante. ➜ tmp wc -c arquivo-aleatório-1 arquivo-aleatório-2 arquivo-aleatório-3 | awk '{$ 1 * = 8; print $ 0} '➜ 32832 arquivo-aleatório-1 ➜ 49152 arquivo-aleatório-2 ➜ 4096000 arquivo-aleatório-3 total total de 4177984
— Felipe

1
Observe que ele tem efeitos colaterais se os arquivos não forem regulares. O segundo exibia um a    barquivo como a b(seqüências de espaços em branco convertidos em um único espaço, espaços em branco removidos).
— Stéphane Chazelas

@StephaneChazelas com que tipo de arquivo não comum você tentou, por favor?
— Totor

Qualquer tipo (fifos, soquetes, portas, dispositivos, diretórios ...). Você também terá problemas com nomes de arquivos que contêm caracteres de nova linha. Você pode adicionar umNR == 1
— Stéphane Chazelas
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.