Wie kann ich die Größe einer Datei in einem Bash-Skript ermitteln?

Wie kann ich die Größe einer Datei in einem Bash-Skript ermitteln?

Wie ordne ich dies einer Bash-Variablen zu, damit ich sie später verwenden kann?

Kommentare

  • stackoverflow.com/questions/5920333/how-to-check-size-of-a-file LOL für die Migration 🙂
  • Koppeln Sie dies mit pv und cat für einen Kopierbefehl, der den Fortschritt und die ETA anzeigt 🙂
  • stat -c% s Datei. name
  • Bei einem (sehr engen) XY-Problem ist dies ordentlich: Wenn Sie lediglich testen müssen, ob die Datei eine Größe ungleich Null hat, hat bash einen bedingten Ausdruck -s, also können Sie einfach testen, ob eine Datei eine Länge ungleich Null hat, mit if [ -s file ]; then echo "file has nonzero size" ; fi

Antwort

Ihre beste Wahl auf einem GNU-System:

stat --printf="%s" file.any 

Von man stat :

% s Gesamtgröße in Bytes

In einem Bash-Skript:

#!/bin/bash FILENAME=/home/heiko/dummy/packages.txt FILESIZE=$(stat -c%s "$FILENAME") echo "Size of $FILENAME = $FILESIZE bytes." 

HINWEIS: Siehe

@ chbrowns Antwort für die Verwendung von stat im Terminal unter Mac OS X.

Kommentare

  • @ haunted85 stat ist der einfachste Weg, vorausgesetzt, Sie ‚ verwenden Linux oder Cygwin (stat ist nicht ‚ t Standard). wc -c als vorgeschlagen von Eug é ne ist portabel.
  • stat: illegal option -- c
  • stat --printf="%s" file.txt ‚ t Geben Sie alles unter Debian Jessie aus …
  • Unter MacOS funktioniert dies: stat -f%z myfile.tar
  • @woohoo Ihre Eingabeaufforderung überschreibt die Ausgabe. man stat sagt, dass –printf die nachfolgende neue Zeile weglässt. Verwenden Sie --format oder -c, um die Ausgabe anzuzeigen. Erhalten Sie mehr Einblick, indem Sie stat --printf="%s" file.any | xxd - mit stat -c "%s" file.any | xxd -

Antwort

vergleichen

file_size_kb=`du -k "$filename" | cut -f1` 

Das Problem bei der Verwendung von stat besteht darin, dass es sich um eine GNU (Linux) -Erweiterung handelt. du -k und cut -f1 werden von POSIX angegeben und sind daher auf jedes Unix-System portierbar.

Solaris wird beispielsweise mit bash ausgeliefert, jedoch nicht mit stat . Dies ist also nicht ganz hypothetisch.

ls hat ein ähnliches Problem, da das genaue Format der Ausgabe nicht angegeben ist und das Parsen der Ausgabe daher nicht portabel erfolgen kann . du -h ist auch eine GNU-Erweiterung.

Halten Sie sich nach Möglichkeit an tragbare Konstrukte, und Sie werden jemandem in Zukunft das Leben leichter machen. Vielleicht Ihr eigenes.

Kommentare

  • du ‚ gibt das nicht an Die Größe der Datei gibt einen Hinweis darauf, wie viel Speicherplatz die Datei verwendet, was sich geringfügig unterscheidet (normalerweise ist die von du angegebene Größe die Größe der Datei, die auf den nächsten aufgerundet wird Anzahl der Blöcke, wobei ein Block normalerweise 512B oder 1kB oder 4kB groß ist.
  • @Gilles, spärliche Dateien (dh solche mit Löchern) melden weniger als die Länge.
  • Dies sollte mit --bytes oder -b anstelle von -k die akzeptierte Antwort sein.
  • @fralau: Das OP möchte “ dies einer Bash-Variablen zuweisen, damit sie es später verwenden können. „, es ist also viel wahrscheinlicher, dass sie einen Aktu wollen al numerischer Wert, keine vom Menschen lesbare Annäherung. Außerdem ist -h eine GNU-Erweiterung. Es ist kein Standard
  • Die Verwendung von du mit dem --apparent-size -Flag gibt mehr zurück genaue Größe (wie am Mann angegeben: print apparent sizes, rather than disk usage; although the apparent size is usually smaller, it may be larger due to holes in ('sparse') files, internal fragmentation, indirect blocks, and the like)

Antwort

Sie können auch den Befehl“ word count „(wc) verwenden:

wc -c "$filename" | awk "{print $1}" 

Das Problem mit wc besteht darin, dass der Dateiname hinzugefügt und die Ausgabe eingerückt wird. Beispiel:

$ wc -c somefile.txt 1160 somefile.txt 

Wenn Sie vermeiden möchten, eine vollständig interpretierte Sprache oder einen Stream-Editor zu verketten, um die Anzahl der Dateien zu ermitteln, leiten Sie die Eingabe einfach aus der Datei um, sodass wc den Dateinamen nie sieht:

wc -c < "$filename" 

Dieses letzte Formular kann mit Befehlssubstitution verwendet werden, um den gesuchten Wert einfach als Shell-Variable abzurufen, wie von Gilles unten.

size="$(wc -c <"$filename")" 

Kommentare

  • wc -c <"$FILENAME" gibt die Größe ohne andere Kruft an, also size=$(wc -c <"$FILENAME").
  • Nur noch ein Punkt: Ich habe es gerade getestet und wc -c < file scheint sehr schnell zu sein, zumindest unter OS X. I ‚ Ich vermute, dass wc die Köpfe hat, um zu versuchen, die Datei zu statisieren, wenn nur -c angegeben wird.
  • @EdwardFalk: GNU wc -c verwendet fstat, sucht dann aber nach dem vorletzten Block der Datei und liest die letzten bis zu st_blksize Bytes. Anscheinend liegt dies daran, dass Dateien unter Linux ‚ s /proc und /sys haben beispielsweise nur ungefähre statistische Größen , und wc möchte die tatsächliche Größe und nicht die vom stat gemeldete Größe angeben. Ich denke, es wäre seltsam für wc -c, eine andere Größe als wc zu melden, aber ‚ hat keine Idee, Daten aus der Datei zu lesen, wenn ‚ eine normale Festplattendatei ist und ‚ nicht im Speicher ist. Oder schlimmer noch: Fast-Line-Bandspeicher …
  • printf sieht immer noch die Einrückung, z. printf "Size: $size" – > size: <4 spaces> 54339. Auf der anderen Seite ignoriert echo das Leerzeichen. Wie kann man es konsistent machen?
  • @keithpjolley: Durch Aufrufen von fstat. Versuchen Sie, strace wc -c </etc/passwd auszuführen, und Sie können sehen, was es tut.

Antwort

BSDs (macOS) stat hat ein anderes Formatargument-Flag und verschiedene Feldspezifizierer. Von man stat(1):

  • -f format: Informationen im angegebenen Format anzeigen. Eine Beschreibung der gültigen Formate finden Sie im Abschnitt FORMATE.
  • … im Abschnitt FORMATE …
  • z: Die Größe von Datei in Bytes.

Also jetzt alle zusammen:

stat -f%z myfile1.txt 

HINWEIS: siehe @ b01 „s Antwort für die Verwendung des Befehls stat auf GNU / Linux-Systemen. 🙂

Kommentare

  • Beachten Sie, dass dies eine reine BSD-Lösung ist. ‚ funktioniert nicht mit GNU stat leider.

Antwort

Hängt davon ab, was Sie unter Größe verstehen.

size=$(wc -c < "$file") 

gibt Ihnen die Anzahl der Bytes an, die aus der Datei gelesen werden können. IOW, es ist die Größe des Inhalts der Datei. Es wird jedoch der Inhalt der Datei gelesen (außer wenn die Datei eine reguläre Datei oder ein Symlink zur regulären Datei in den meisten wc -Implementierungen als Optimierung ist). Das kann Nebenwirkungen haben. Beispielsweise kann für eine Named Pipe das Gelesene nicht mehr erneut gelesen werden und für Dinge wie /dev/zero oder /dev/random, die von sind unendlich groß, es wird eine Weile dauern. Das bedeutet auch, dass Sie die Berechtigung read für die Datei benötigen und der letzte Zugriffszeitstempel der Datei möglicherweise aktualisiert werden.

Dies ist Standard und portabel. Beachten Sie jedoch, dass einige wc -Implementierungen führende Leerzeichen in dieser Ausgabe enthalten können. Eine Möglichkeit, sie zu entfernen, besteht darin, Folgendes zu verwenden:

size=$(($(wc -c < "$file"))) 

oder einen Fehler bei einem leeren arithmetischen Ausdruck in dash oder yash, wenn wc keine Ausgabe erzeugt (z. B. wenn die Datei nicht geöffnet werden kann):

size=$(($(wc -c < "$file") +0)) 

ksh93 hat wc eingebaut (sofern Sie es aktivieren, können Sie es auch aufrufen als command /opt/ast/bin/wc), was es für reguläre Dateien in dieser Shell am effizientesten macht.

Verschiedene Systeme haben einen Befehl namens stat das ist eine Schnittstelle zu den Systemaufrufen stat() oder lstat().

Diese Berichtsinformationen finden Sie in der Inode. Eine dieser Informationen ist das Attribut st_size. Bei regulären Dateien entspricht dies der Größe des Inhalts (wie viele Daten könnten ohne Fehler daraus gelesen werden (dies ist das, was die meisten wc -c -Implementierungen bei ihrer Optimierung verwenden). ). Bei Symlinks ist dies die Größe des Zielpfads in Byte. Bei benannten Pipes ist es je nach System entweder 0 oder die Anzahl der derzeit im Pipe-Puffer befindlichen Bytes. Gleiches gilt für Blockgeräte, bei denen Sie je nach System 0 oder die Größe des zugrunde liegenden Speichers in Byte erhalten.

Sie benötigen keine Leseberechtigung für die Datei, um diese Informationen abzurufen, sondern nur die Suchberechtigung für den Verzeichnis, mit dem es verknüpft ist.

In chronologischer Reihenfolge gibt es:

  • IRIX stat (90 „s):

    stat -qLs -- "$file" 

    gibt das Attribut st_size von $file (lstat()) oder:

    stat -s -- "$file" 

    dasselbe, außer wenn $file ist ein Symlink. In diesem Fall ist es die st_size der Datei nach der Symlink-Auflösung.

  • zsh stat integriert (jetzt auch als zstat) im Modul zsh/stat (geladen mit zmodload zsh/stat) (1997):

    stat -L +size -- $file # st_size of file stat +size -- $file # after symlink resolution 

    oder zum Speichern in einer Variablen:

    stat -L -A size +size -- $file 

    das ist natürlich das effizienteste in diese Shell.

  • GNU stat (2001); auch in BusyBox stat seit 2 005 (kopiert von GNU stat):

    stat -c %s -- "$file" # st_size of file stat -Lc %s -- "$file" # after symlink resolution 

    (beachten Sie die Bedeutung von -L ist im Vergleich zu IRIX oder zsh stat umgekehrt.

  • BSDs stat (2002):

    stat -f %z -- "$file" # st_size of file stat -Lf %z -- "$file" # after symlink resolution 

Oder Sie können die Funktion stat() / lstat() einer Skriptsprache wie perl:

perl -le "print((lstat shift)[7])" -- "$file" 

AIX hat auch eine istat Befehl , der alle stat() (nicht lstat() ausgibt, funktioniert also nicht mit Symlinks ) Informationen, mit denen Sie beispielsweise nachbearbeiten können:

LC_ALL=C istat "$file" | awk "NR == 4 {print $5}" 

(danke @JeffSchaller für die Hilfe beim Herausfinden der Details ).

In tcsh:

@ size = -Z $file:q 

(Größe nach Symlink-Auflösung)

Lange bevor GNU seinen Befehl stat einführte, konnte dasselbe mit GNU find Befehl mit seinem Prädikat -printf (bereits 1991):

find -- "$file" -prune -printf "%s\n" # st_size of file find -L -- "$file" -prune -printf "%s\n" # after symlink resolution 

Ein Problem ist jedoch, dass dies nicht der Fall ist funktionieren, wenn $file mit - beginnt oder ein find Prädikat ist (wie !, ( …).

Der Standardbefehl zum Abrufen der stat() / lstat() Informationen sind ls.

POSIXly können Sie Folgendes tun:

LC_ALL=C ls -dn -- "$file" | awk "{print $5; exit}" 

und fügen Sie nach der Symlink-Auflösung -L hinzu. Dies funktioniert jedoch nicht für Gerätedateien, bei denen das 5. Feld die Hauptnummer des Geräts anstelle der Größe ist.

Für Blockgeräte Systeme mit stat() gibt 0 für st_size zurück und verfügt normalerweise über andere APIs, um die Größe des Blockgeräts zu melden. Linux hat beispielsweise die BLKGETSIZE64 ioctl() und die meisten Linux-Distributionen werden jetzt mit einem blockdev -Befehl ausgeliefert, der davon Gebrauch machen kann:

blockdev --getsize64 -- "$device_file" 

Dafür benötigen Sie jedoch eine Leseberechtigung für die Gerätedatei. Es ist normalerweise möglich, die Größe auf andere Weise abzuleiten. Zum Beispiel (immer noch unter Linux):

lsblk -bdno size -- "$device_file" 

Sollte außer bei leeren Geräten funktionieren.

Ein Ansatz, der für alle funktioniert Suchbare Dateien (einschließlich regulärer Dateien, die meisten Blockgeräte und einige Zeichengeräte) müssen die Datei öffnen und bis zum Ende suchen:

  • Mit zsh (nach dem Laden des Moduls zsh/system):

    {sysseek -w end 0 && size=$((systell(0)))} < $file 
  • Mit ksh93:

    < "$file" <#((size=EOF)) 

    oder

    { size=$(<#((EOF))); } < "$file" 
  • mit perl:

    perl -le "seek STDIN, 0, 2 or die "seek: $!"; print tell STDIN" < "$file" 

Bei Named Pipes haben wir festgestellt, dass einige Systeme (mindestens AIX, Solaris, HP / UX) die Datenmenge im Pipe-Puffer in stat() „s verfügbar machen st_size. Einige (wie Linux oder FreeBSD) tun dies nicht.

Zumindest unter Linux können Sie die FIONREAD ioctl() nach dem Öffnen der Pipe (im Lese- / Schreibmodus, um ein Hängenbleiben zu vermeiden):

fuser -s -- "$fifo_file" && perl -le "require "sys/ioctl.ph"; ioctl(STDIN, &FIONREAD, $n) or die$!; print unpack "L", $n" <> "$fifo_file" 

Beachten Sie jedoch, dass dies nicht „t read der Inhalt der Pfeife, das bloße Öffnen der genannten Pfeife hier kann noch Nebenwirkungen haben. Wir verwenden fuser, um zuerst zu überprüfen, ob bei einem Prozess die Pipe bereits geöffnet ist, um dies zu mildern. Dies ist jedoch nicht kinderleicht, wie dies bei fuser der Fall ist nicht in der Lage sein, alle Prozesse zu überprüfen.

Bisher haben wir nur die Größe der primären Daten berücksichtigt, die den Dateien zugeordnet sind.Dies berücksichtigt nicht die Größe der Metadaten und die gesamte unterstützende Infrastruktur, die zum Speichern dieser Datei erforderlich ist.

Ein weiteres von stat() zurückgegebenes Inode-Attribut ist st_blocks. Dies ist die Anzahl der 512-Byte-Blöcke, die zum Speichern der Daten der Datei verwendet werden (und manchmal einige ihrer Metadaten wie die erweiterten Attribute auf ext4-Dateisystemen unter Linux) „t enthält nicht den Inode selbst oder die Einträge in den Verzeichnissen, mit denen die Datei verknüpft ist.

Größe und Festplattennutzung hängen nicht unbedingt eng mit Komprimierung, Spärlichkeit (manchmal einige Metadaten) und zusätzlicher Infrastruktur wie indirekten Blöcken zusammen In einigen Dateisystemen wird letzteres beeinflusst.

Dies ist normalerweise das, was du verwendet, um die Festplattennutzung zu melden. Die meisten der oben aufgeführten Befehle können dies Sie erhalten diese Informationen.

  • POSIXLY_CORRECT=1 ls -sd -- "$file" | awk "{print $1; exit}"
  • POSIXLY_CORRECT=1 du -s -- "$file" (nicht für Verzeichnisse wo das die Festplatte usag einschließen würde e der Dateien innerhalb).
  • GNU find -- "$file" -printf "%b\n"
  • zstat -L +block -- $file
  • GNU stat -c %b -- "$file"
  • BSD stat -f %b -- "$file"
  • perl -le "print((lstat shift)[12])" -- "$file"

Kommentare

  • eindeutig die umfassendste und informativste Antwort. Danke. Ich kann dies verwenden, um plattformübergreifende Bash-Skripte unter Verwendung der BSD- und GNU-Statistikinformationen zu erstellen.
  • Unterhaltsame Tatsache: GNU-Coreutils wc -c verwendet fstat, liest dann aber die letzten bis zu st_blksize Bytes. Anscheinend liegt dies daran, dass Dateien unter Linux ‚ s /proc und /sys haben beispielsweise statistische Größen, die nur ungefähr sind . Dies ist gut für die Korrektheit, aber schlecht, wenn sich das Ende der Datei auf der Festplatte und nicht im Speicher befindet (insbesondere, wenn es für viele Dateien in einer Schleife verwendet wird). Und sehr schlecht, wenn die Datei auf Nearline-Bandspeicher migriert wird, oder z. ein FUSE-Dateisystem mit transparenter Dekomprimierung.
  • würde dies nicht auch funktionieren div> wären die SysV, sie würden ‚ nicht auf BSDs funktionieren (optional (XSI) in POSIX). Sie ‚ benötigen außerdem ls -god file | awk '{print $3; exit}' (-d, damit es in Verzeichnissen funktioniert, exit für Symlinks mit Zeilenumbrüchen im Ziel). Die Probleme mit Gerätedateien bleiben ebenfalls bestehen.
  • @ αғsнιη Die Unix-API unterscheidet nicht zwischen Text- und Binärdateien. ‚ sind alle Folgen von Bytes. Einige Anwendungen möchten diese Bytes möglicherweise als Text interpretieren, aber offensichtlich nicht wc -c, das die Anzahl der Bytes angibt.

Antwort

Dieses Skript kombiniert viele Möglichkeiten zur Berechnung der Dateigröße:

( du --apparent-size --block-size=1 "$file" 2>/dev/null || gdu --apparent-size --block-size=1 "$file" 2>/dev/null || find "$file" -printf "%s" 2>/dev/null || gfind "$file" -printf "%s" 2>/dev/null || stat --printf="%s" "$file" 2>/dev/null || stat -f%z "$file" 2>/dev/null || wc -c <"$file" 2>/dev/null ) | awk "{print $1}" 

Das Skript funktioniert auf vielen Unix-Systemen einschließlich Linux, BSD, OSX, Solaris, SunOS usw.

Die Dateigröße gibt die Anzahl der Bytes an. Dies ist die scheinbare Größe, dh die Bytes, die die Datei auf einer typischen Festplatte ohne spezielle Komprimierung oder spezielle Bereiche mit geringer Dichte oder nicht zugewiesene Blöcke usw. verwendet.

Dieses Skript verfügt über eine Produktionsversion mit mehr Hilfe und Weitere Optionen hier: https://github.com/SixArm/file-size

Antwort

stat scheint dies mit den wenigsten Systemaufrufen zu tun:

$ set debian-live-8.2.0-amd64-xfce-desktop.iso $ strace stat --format %s $1 | wc 282 2795 27364 $ strace wc --bytes $1 | wc 307 3063 29091 $ strace du --bytes $1 | wc 437 4376 41955 $ strace find $1 -printf %s | wc 604 6061 64793 

Antwort

ls -l filename gibt Ihnen viele Informationen zu einer Datei, einschließlich Dateigröße, Berechtigungen und Eigentümer. P. >

Die Dateigröße in der fünften Spalte und wird in Byte angezeigt. Im folgenden Beispiel liegt die Dateigröße knapp unter 2 KB:

-rw-r--r-- 1 user owner 1985 2011-07-12 16:48 index.php 

Bearbeiten: Dies ist anscheinend nicht so zuverlässig wie der Befehl stat.

Kommentare

    ch denke, sowohl der Befehl ls -l als auch der Befehl stat geben zuverlässige Größeninformationen. Ich habe keinen gegenteiligen Hinweis gefunden. ls -s gibt die Größe in Anzahl der Blöcke an.

  • @ dabest1 ‚ ist in einem Sinne nicht zuverlässig, dass in Bei einem anderen Unix kann die Ausgabe unterschiedlich sein (und bei einigen Unixen auch).
  • Ja, IIRC, Solaris hat den Gruppennamen standardmäßig nicht ‚ angezeigt. Dies führt zu weniger Spalten in der Ausgabe.
  • Da die Größe rein numerisch und von Leerzeichen umgeben ist und das Datumsjahr rein numerisch in einem definierten Format ist, kann ein regulärer Ausdruck zur Behandlung des Benutzers verwendet werden + Eigentümer als ein Feld, unabhängig davon, ob die Gruppe anwesend war oder nicht. (eine Übung für den Leser!)

Antwort

du filename zeigt Ihnen die Festplattennutzung in Bytes an.

Ich bevorzuge du -h filename, wodurch Sie die Größe in einem für Menschen lesbaren Format erhalten.

Kommentare

  • dass oder stat -c "%s"😉
  • Diese Variante von du druckt die Größe in Blöcken von aus 1024 Bytes, keine einfache Anzahl von Bytes.
  • Beachten Sie, dass Standard du eine Ausgabe in Anzahl von 512-Byte-Einheiten liefert. GNU du verwendet stattdessen Kibibyte, sofern nicht POSIXLY_CORRECT in seiner Umgebung aufgerufen wird.
  • Für Dateien vom Typ Verzeichnis , das gibt die Festplattennutzung des Verzeichnisses, aber auch aller anderen Dateien in (rekursiv) an.

Antwort

Erstellen Sie kleine Dienstprogrammfunktionen in Ihren Shell-Skripten, an die Sie delegieren können.

Beispiel

#! /bin/sh - # vim: set ft=sh # size utility that works on GNU and BSD systems size(){ case $(uname) in (Darwin | *BSD*) stat -Lf %z -- "$1";; (*) stat -c %s -- "$1" esac } for f do printf "%s\n" "$f : $(gzip < "$f" | wc -c) bytes (versus $(size "$f") bytes)" done 

Basierend auf Informationen aus der Antwort von @ Stéphane Chazelas.

Kommentare

  • Siehe auch gzip -v < file > /dev/null, um die Komprimierbarkeit einer Datei zu überprüfen.
  • @St é phaneChazelas nicht sicher, ob ich denke, dass es eine Verbesserung war. Diese Fallaussagen können Noobs leicht abschrecken; ich erinnere mich sicherlich nie daran, wie man sie richtig macht 🙂 sind Fallaussagen von Natur aus portabler als Sie habe ich den Punkt gesehen, an dem es mehr als zwei Fälle gibt, aber ansonsten … +
  • Ich nehme an, dass ‚ auch Geschmackssache ist, Aber hier ist ‚ der typische Fall, in dem Sie ‚ eine case verwenden möchten Anweisung. case ist das Bourne / POSIX-Konstrukt für den Mustervergleich. [[...]] ist nur ksh / bash / zsh (mit Variationen).

Antwort

Ich habe gefunden ein AWK 1 Liner, und es hatte einen Fehler, aber ich habe ihn behoben. Ich habe auch PetaBytes nach TeraBytes hinzugefügt.

FILE_SIZE=234234 # FILESIZE IN BYTES FILE_SIZE=$(echo "${FILE_SIZE}" | awk "{ split( "B KB MB GB TB PB" , v ); s=1; while( $1>1024 ){ $1/=1024; s++ } printf "%.2f %s", $1, v[s] }") 

Unter Berücksichtigung von stat ist nicht auf jedem einzelnen System verfügbar, Sie können fast immer die AWK-Lösung verwenden. Beispiel; Der Raspberry Pi hat nicht stat , aber awk .

Kommentare

  • Ganz NICHT, was das OP gefragt hat, aber nette kleine Arbeit.

Antwort

Ich mag die Option wc selbst. Gepaart mit „bc“ können Sie Dezimalstellen an beliebig vielen Stellen abrufen.

Ich wollte ein Skript verbessern, das die Spalte „Dateigröße“ eines „ls -“ entfernt hat. alh „Befehl. Ich wollte nicht nur ganzzahlige Dateigrößen, und zwei Dezimalstellen schienen zu passen. Nachdem ich diese Diskussion gelesen hatte, kam ich auf den folgenden Code.

Ich schlage vor, die Zeile an den Semikolons zu unterbrechen, wenn Sie dies in ein Skript aufnehmen.

file=$1; string=$(wc -c $file); bite=${string% *}; okay=$(echo "scale=2; $bite/1024" | bc);friend=$(echo -e "$file $okay" "kb"); echo -e "$friend"

My Das Skript heißt gpfl für „Bilddateilänge abrufen“. Ich verwende es, nachdem ich eine mogrify für eine Datei in imagemagick ausgeführt habe, bevor ich ein Bild in einem GUI-JPEG-Viewer öffne oder erneut lade.

Ich weiß nicht, wie dies bewertet wird eine „Antwort“, da sie viel von dem leiht, was bereits angeboten und diskutiert wurde. Also lasse ich es dort.

BZT

Kommentare

  • Ich würde es vorziehen, zu verwenden “ stat “ oder “ ls “ Normalerweise verwende ich ‚ nicht gerne “ wc „, um Dateigrößen zu erhalten, weil Es liest physisch die gesamte Datei. Wenn Sie viele Dateien oder besonders große Dateien haben, kann dies viel Zeit in Anspruch nehmen. Aber Ihre Lösung ist kreativ … + 1.
  • Ich stimme dem Gedanken zu der Verwendung von “ stat “ über “ wc “ für die Dateigröße. Wenn Sie jedoch “ wc -c “ verwenden, werden keine Daten gelesen, stattdessen wird lseek verwendet Ermitteln Sie die Anzahl der Bytes in einer Datei. lingrok.org/xref/coreutils/src/wc.c#228
  • @ bbaja42 : Beachten Sie, dass GNU Coreutils liest den letzten Block der Datei, falls stat.st_size nur eine Annäherung war (wie für Linux /proc und /sys Dateien). Ich denke, sie haben beschlossen, den Hauptkommentar nicht komplizierter zu machen, als sie diese Logik ein paar Zeilen weiter hinzufügten: lingrok.org/xref/coreutils/src/wc.c#246

Antwort

Die schnellste und einfachste Methode (IMO) ist:

bash_var=$(stat -c %s /path/to/filename) 

Kommentare

  • Stimmen Sie dann eine oder mehrere der vorhandenen Antworten ab, in denen stat erwähnt wird. Keine Notwendigkeit, es noch einmal zu wiederholen …
  • @JeffSchaller Ich habe gerade die Antwort von Stephane ‚ auf Ihre Anweisungen hochgestuft.Ich denke, es ist zu kompliziert für meine Zwecke. Aus diesem Grund habe ich diese einfache Antwort für gleichgesinnte Seelen veröffentlicht.
  • Danke; ‚ ist nur eine sechste Instanz eines “ stat “ Antwort vereinfacht ‚ dieses Q & A nicht, sondern lässt einen neuen Leser sich fragen “ Wie unterscheidet sich diese Antwort von den anderen? “ und führt zu mehr Verwirrung statt weniger.
  • @JeffSchaller, denke ich. Aber ich könnte mich über die vielen du und wc Antworten beschweren, die einen Haftungsausschluss haben sollten Leben. Ich habe meine Antwort heute Abend nur in einer realen Anwendung verwendet und fand, dass es sich lohnt, sie zu teilen. Ich denke, wir haben alle unsere Meinung zuckt mit den Schultern .

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.