¿Cómo se puede saber cuántos bits tiene un archivo en un comando?


9

Sé que puedo usar ls -latpara averiguar cuántos bytes tiene un archivo y luego multiplicar por 8 para averiguar cuántos bits. ¿Pero es esto posible en una sola línea de comando?


55
No lo creo. Tampoco veo ningún uso práctico para una función como esa ^^
Martin von Wittich

1
@MartinvonWittich - las velocidades de Internet a menudo se realizan en ' bits por segundo' ...
Wilf

44
@wilf: menos gastos generales de protocolo.
Ignacio Vazquez-Abrams

En mi caso, estoy usando esta prueba de demanda: csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html y el parámetro es el número de bits que quiero analizar.
Felipe

Respuestas:


15

Con GNU du:

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

99
Excepto que no necesita bc, awkpuede hacer matemáticas por sí mismo:du -b FILE | awk '{print $1 * 8}
aragaer

Ver también wc -c < FILEpara un equivalente portátil (para archivos no regulares, sin embargo, tiene el efecto secundario de leerlos)
Stéphane Chazelas

5

Una solución shell + GNU coreutils:

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

La -c%sopción de statdevolver solo el tamaño del archivo en bytes, eliminando cualquier necesidad de procesamiento de texto adicional. Esta sintaxis es compatible con GNU coreutils y, por lo tanto, debería funcionar en la mayoría de las distribuciones de Linux.

Como excepción en Linux, si uno está ejecutando zsh con el módulo opcional zsh / stat, entonces se necesita especificar una ruta para obtener los coreutils de GNU:

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

@StephaneChazelas Gracias por la información. Respuesta actualizada
John1024

Parece una buena explicación, gracias. Sin embargo, en mi prueba, este comando me regresó: título: 7: mala expresión matemática: operando esperado en `% s '] 2; echo 4096000 ---- la respuesta es 4096000, pero ¿cuáles son los otros errores?
Felipe

@FelipeMicaroniLalli No puedo reproducir ese error y no veo ninguna circunstancia que pueda (a) dar ese mensaje de error y, al mismo tiempo, (b) dar la respuesta numérica correcta. Curioso.
John1024

3

Con GNU find(anterior a GNU statpor décadas):

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

Relativamente portátil:

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

3

Es posible en una línea, porque puede poner varios comandos en una línea, por ejemplo, conectados por tuberías o sustituciones de comandos:

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

(Gracias @frostschutz por la actualización).


Funcionó como un encanto para mí. ➜ tmp stat random-file-3 | sed -n 's / Tamaño: ([0-9] *). * / \ 1 * 8 / p' | aC ➜ 4096000
Felipe

No funcionará en ZSize: 5
entornos

1
¿qué tal stat -c %s FILEimprimir tamaño directamente, en lugar de la sed?
frostschutz

2

Archivo único:

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

Múltiples archivos:

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

Este también funciona para un solo archivo. Sin embargo, no es completamente a prueba de balas, vea el comentario de Stephane .

Estos son comandos compatibles con el estándar POSIX.


Excelente. Increíble. Mp tmp wc -c archivo-aleatorio-1 archivo-aleatorio-2 archivo-aleatorio-3 | awk '{$ 1 * = 8; print $ 0} '➜ 32832 random-file-1 ➜ 49152 random-file-2 ➜ 4096000 random-file-3 ➜ 4177984 total
Felipe

1
Tenga en cuenta que tiene efectos secundarios si los archivos no son archivos normales. El segundo mostraría un a    barchivo como a b(secuencias de espacios en blanco convertidos en un solo espacio, espacios en blanco eliminados).
Stéphane Chazelas

@StephaneChazelas con qué tipo de archivo no regular intentaste por favor?
Totor

Cualquier tipo (fifos, enchufes, puertas, dispositivos, directorios ...). También tendrá problemas con los nombres de archivo que contienen caracteres de nueva línea. Es posible que desee agregar unNR == 1
Stéphane Chazelas
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.