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?

Felipe
fonte
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
cybermage14
fonte
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) ))
John1024
fonte
@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}'
Stéphane Chazelas
fonte
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).

choroba
fonte
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.

Totor
fonte
Ó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