Dateigröße in Byte unter 1 GB in Megabyte größer 1GB?

FatManStanding

Lieutenant
Registriert
Aug. 2021
Beiträge
676
Hi,

vermutlich habe ich irgendeinen Denkfehler. Ich habe hier eine Liste von Dateigrößen die in while weiterverarbeitet wird. Die Größe ist in Byte. Es soll geprüft werden ob die Größe unter 1073741824 Byte ist (= 1024 * 1024 * 1024). Falls ja wird in Megabyte umgerechnet und eine Einheit dahinter gesetzt. Falls nicht wird alles in Gigabyte ausgegeben (das habe ich weggelassen weil man den Fehler schon so sieht). Meiner Logik nach sollte jeder Wert nach Umrechnung in Megabyte unter 1000 liegen - tun sie aber nicht, manche sind knapp drüber. Warum?

Code:
size=$(ls -l *.ext | tr -s ' ' | cut -d " " -f 5)
echo "$size" | while read line; do
if [ "$line" -le 1073741824 ]; then
size=$(( line / 1024 / 1024 ))
fi
echo "$size"
done

Vermutlich kann man das auch mit printf oder was weiß ich machen, es geht mir aber um das Erkennen meines Denkfehlers.
 
  • Gefällt mir
Reaktionen: madmax2010, Nilson, tollertyp und eine weitere Person
FatManStanding schrieb:
Meiner Logik nach sollte jeder Wert nach Umrechnung in Megabyte unter 1000 liegen - tun sie aber nicht, manche sind knapp drüber. Warum?

Du hast 1024 als Umrechnungsfaktor ... daher muss jeder Wert bis 1024 in Megabyte angebar sein ... erst danach wird in GB umgerechnet.

1024*1024*1024 sind ja deine 1073741824
und nicht 1024*1024*1000.

Ansonsten heist es Mebibyte ...

du kommst mit der Nomenklatur für die Binäre Schreibweise und die Dezimale durcheinander.
 
  • Gefällt mir
Reaktionen: qiller
FatManStanding schrieb:
Falls ja wird in Megabyte umgerechnet
Die andern habens ja schon gesagt: Du rechnest nicht in Megabyte "MB" (10^6 Byte), sondern in Mebibyte "MiB" (2^20 Byte) um. Daher werden auch Dateien, die zwischen 1001 und 1024 MiB groß sind mit angezeigt. Du rechnest also eigentlich schon richtig, nur die Schlussfolgerung, dass bei der Umrechnung alles kleiner gleich 1000 ist, ist falsch.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Tzk
Teste mal die Option -h für den ls-Befehl. Du kannst mir später danken :D
 
  • Gefällt mir
Reaktionen: stefan92x, madmax2010, ReignInBlo0d und 2 andere
Die Ausgabe von ls -l kann u.U. auch anders aussehen als du oder dein Skript erwarten. Wenn ich in einem Skript die Größe einer Datei brauche, nehme ich stat -c %s Dateiname. Damit sparst du dir auch das Parsen der Ausgabe über Pipes.
 
Donnerkind schrieb:
Wenn ich in einem Skript die Größe einer Datei brauche, nehme ich stat -c %s Dateiname. Damit sparst du dir auch das Parsen der Ausgabe über Pipes.
Oder die "-printf" option von find(1).

Dieses dürfte den Vorstellungen des TOs sehr nahe kommen:
Code:
find . -maxdepth 1 -printf "%s %p\n" | numfmt --field 1 --to=si | column -t
bzw.
Code:
find . -maxdepth 1 -size +1M -printf "%s %p\n" | numfmt --field 1 --to=si | column -t
 
1GiB = 1 * 2^30 = 1.073.741.824 Byte
1GB = 1 * 10^9 = 1.000.000.000 Byte

Musst du dir schon überlegen in welchem Prefix du bleiben möchtest.

Dezimal (1000) = Byte, KiloByte, MegaByte, GigaByte, TeraByte, ...
Binär (1024) = Byte, KibiByte, MebiByte, GibiByte, TebiByte, ...

Um wieder in die nächst Höhere Dateigröße umzurechnen dividierst du wieder durch die jeweiligen Potenzen.

Bsp.: 1.073.741.824 Byte / 2^30 = 1 GibiByte

1.073.741.824 Byte / 10^9 = 1,073741824 GigaByte

1767480942271.png
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: qiller
Zurück
Oben