Wie findet man heraus, wie viele Bits eine Datei in einem Befehl hat?

9

Ich weiß, dass ich ls -latdamit herausfinden kann, wie viele Bytes eine Datei enthält, und dann mit 8 multiplizieren kann, um herauszufinden, wie viele Bits es gibt. Aber ist das nur in einer Kommandozeile möglich?

Felipe
quelle
5
Das glaube ich nicht. Ich sehe auch keine praktische Verwendung für eine
Martin von Wittich
1
@ MartinvonWittich - Internetgeschwindigkeiten werden oft in ' Bits pro Sekunde' gemacht ...
Wilf
4
@wilf: Minus Protokoll Overhead.
Ignacio Vazquez-Abrams
In meinem Fall verwende ich diesen Anzugstest : csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html und der Parameter ist die Anzahl der Bits, die ich analysieren möchte.
Felipe

Antworten:

15

Mit GNU du:

du -b FILE | awk '{ print $1, "* 8" }' | bc
cybermage14
quelle
9
Außer es braucht nicht bc- awkkann selbst du -b FILE | awk '{print $1 * 8}
rechnen
Siehe auch wc -c < FILEfür ein tragbares Äquivalent (für nicht reguläre Dateien hat es den Nebeneffekt, sie zu lesen)
Stéphane Chazelas
5

Eine Shell + GNU Coreutils-Lösung:

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

Die -c%sOption, statnur die Dateigröße in Bytes zurückzugeben, macht zusätzliche Textverarbeitung überflüssig. Diese Syntax wird von GNU-Coreutils unterstützt und sollte daher unter den meisten Linux-Distributionen funktionieren.

Wenn unter Linux zsh mit dem optionalen zsh / stat-Modul ausgeführt wird, muss ausnahmsweise ein Pfad angegeben werden, um die GNU-Coreutils abzurufen:

echo $(( 8 * $(command stat -c%s FILE) ))
John1024
quelle
@StephaneChazelas Danke für die Info. Antwort aktualisiert.
John1024
Es scheint eine gute Erklärung zu sein, danke. In meinem Test kehrte dieser Befehl jedoch zu mir zurück: title: 7: schlechter mathematischer Ausdruck: Operand erwartet bei `% s '] 2; echo 4096000 ---- die Antwort ist 4096000, aber was sind die anderen Fehler?
Felipe
@FelipeMicaroniLalli Ich kann diesen Fehler nicht reproduzieren und sehe keinen Umstand, der sowohl (a) diese Fehlermeldung als auch (b) die richtige numerische Antwort ergibt. Neugierig.
John1024
3

Mit GNU find( statum Jahrzehnte vor GNU ):

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

Relativ tragbar:

ls -ld -- "$file" | awk '{print $5*8;exit}'
Stéphane Chazelas
quelle
3

Dies ist in einer Zeile möglich, da Sie mehrere Befehle in eine Zeile einfügen können, z. B. durch Pipes oder Befehlsersetzungen verbunden:

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

(Danke @frostschutz für das Update).

Choroba
quelle
Arbeitete wie ein Zauber für mich. ➜ tmp stat random-file-3 | sed -n 's / Größe: ([0-9] *). * / \ 1 * 8 / p' | bc 96 4096000
Felipe
Funktioniert nicht in nicht englischen Gebietsschemas oder auf Nicht-GNU-Systemen oder für eine Datei, die ZSize: 5zum Beispiel aufgerufen wird
Stéphane Chazelas
1
Wie wäre es stat -c %s FILE, die Größe direkt anstelle der zu drucken sed?
Frostschutz
2

Einzelne Datei:

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

Mehrere Dateien:

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

Dieser funktioniert auch für eine einzelne Datei. Es ist jedoch nicht vollständig kugelsicher, siehe Stephanes Kommentar.

Dies sind POSIX-Standard-kompatible Befehle.

Totor
quelle
Großartig. Genial. ➜ tmp wc -c Zufallsdatei-1 Zufallsdatei-2 Zufallsdatei-3 | awk '{$ 1 * = 8; print $ 0} '➜ 32832 Zufallsdatei-1 ➜ 49152 Zufallsdatei-2 ➜ 4096000 Zufallsdatei-3 ➜ 4177984 gesamt
Felipe
1
Beachten Sie, dass es Nebenwirkungen hat, wenn die Dateien keine regulären Dateien sind. Die zweite würde eine a    bDatei als anzeigen a b(Sequenzen von Leerzeichen, die in ein einzelnes Leerzeichen konvertiert wurden, nachfolgende Leerzeichen entfernt).
Stéphane Chazelas
@StephaneChazelas mit welcher Art von nicht regulärer Datei haben Sie bitte versucht?
Totor
Beliebiger Typ (Fifos, Steckdosen, Türen, Geräte, Verzeichnisse ...). Sie haben auch Probleme mit Dateinamen, die Zeilenumbrüche enthalten. Vielleicht möchten Sie eineNR == 1
Stéphane Chazelas