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
undcat
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, mitif [ -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 Siestat --printf="%s" file.any | xxd -
mitstat -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 vondu
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, alsosize=$(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
verwendetfstat
, sucht dann aber nach dem vorletzten Block der Datei und liest die letzten bis zust_blksize
Bytes. Anscheinend liegt dies daran, dass Dateien unter Linux ‚ s/proc
und/sys
haben beispielsweise nur ungefähre statistische Größen , undwc
möchte die tatsächliche Größe und nicht die vom stat gemeldete Größe angeben. Ich denke, es wäre seltsam fürwc -c
, eine andere Größe alswc
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 ignoriertecho
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 diest_size
der Datei nach der Symlink-Auflösung. -
zsh
stat
integriert (jetzt auch alszstat
) im Modulzsh/stat
(geladen mitzmodload 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 BusyBoxstat
seit 2 005 (kopiert von GNUstat
):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 oderzsh
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 Modulszsh/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
verwendetfstat
, liest dann aber die letzten bis zust_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
- @ 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!)
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.
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. GNUdu
verwendet stattdessen Kibibyte, sofern nichtPOSIXLY_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
undwc
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 .