¿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?

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

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

Totor
fuente
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