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?


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

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) ))

@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}'

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).


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.