Frage

Unter Linux verwende ich stat --format="%s" FILE, aber Solaris-ich habe Zugang zu nicht stat-Befehl.Was soll ich dann verwenden?

Ich bin das schreiben von Bash-Skripten, und kann nicht wirklich Installation einer neuen software auf dem system.

Ich hab mir überlegt, die bereits mit:

perl -e '@x=stat(shift);print $x[7]' FILE

oder auch:

ls -nl FILE | awk '{print $5}'

Aber weder dieser sieht vernünftig - running Perl nur, um Dateigröße?Oder laufen 2 Befehle, das gleiche zu tun?

War es hilfreich?

Lösung

wc -c < filename (kurz für Wortanzahl, -c druckt die Byte-Zählung) ist ein tragbarer, POSIX Lösung. Nur das Ausgabeformat über Plattformen hinweg nicht gleichförmig sein könnte, da einige Räume vorangestellt werden können (was der Fall für Solaris ist).

Sie die Eingabeumleitung nicht auslassen. Wenn die Datei als Argument übergeben wird, wird der Dateiname nach der Byteanzahl gedruckt.

ich war besorgt, dass es nicht für binäre Dateien funktionieren würde, aber es funktioniert sowohl unter Linux und Solaris OK. Sie können es mit wc -c < /usr/bin/wc versuchen. Außerdem ist POSIX-Dienstprogramme garantiert zu handhaben Binärdateien , sofern nicht ausdrücklich anders angegeben.

Andere Tipps

ich am Ende mein eigenes Programm zu schreiben (wirklich klein) nur die Größe angezeigt werden soll. Weitere Informationen hier: http: // fwhacking .blogspot.com / 2011/03 / bfsize-print-file-size-in-Bytes-and.html

Die beiden sauberen Wege meiner Meinung nach mit gemeinsamen Linux-Tool sind:

$ stat -c %s /usr/bin/stat
50000

$ wc -c < /usr/bin/wc
36912

Aber ich will einfach keine Parameter oder Rohr, um die Ausgabe der Eingabe nur eine Dateigröße zu erhalten, so dass ich mit meinem eigenen bfsize.

Auch wenn du in der Regel Plattennutzung druckt und nicht die tatsächlichen Datengröße, GNU coreutils du kann Datei „scheinbare Größe“ in Bytes drucken:

du -b FILE

Aber es wird unter BSD nicht funktionieren, Solaris, MacOS, ...

Schließlich entschied ich mich für den ls-und bash-array expansion:

TEMP=( $( ls -ln FILE ) )
SIZE=${TEMP[4]}

es ist nicht wirklich schön, aber zumindest tut es nur 1 Gabel+execve, und es verlässt sich nicht auf sekundäre Programmiersprache (perl/ruby/python/was auch immer)

Cross-Plattform schnellste Lösung (verwendet nur einzelne fork () für ls , versucht nicht, tatsächliche Zeichen zu zählen, laichen nicht unnötigen awk, Perl, etc.).

Getestet auf MacOS, Linux - kann es zu geringfügigen Änderung für Solaris benötigen:

__ln=( $( ls -Lon "$1" ) )
__size=${__ln[3]}
echo "Size is: $__size bytes"

Bei Bedarf vereinfachen ls Argumente und adjust Offset in $ {__ ln [3]}.

. Hinweis: wird Symlinks folgen

BSDs haben mit verschiedenen Optionen aus dem GNU stat coreutils ein, aber ähnlichen Fähigkeiten.

stat -f %z <file name> 

Dies funktioniert auf macOS (getestet auf 10,12), FreeBSD , NetBSD und OpenBSD .

Wenn Sie find von GNU fileutils verwenden:

size=$( find . -maxdepth 1 -type f -name filename -printf '%s' )

Leider andere Implementierungen von find in der Regel nicht -maxdepth, noch -printf unterstützen. Dies ist der Fall bei z.B. Solaris und Mac OS find.

Wenn ls -n Ausgang der Verarbeitung als Alternative zu schlecht tragbaren Shell-Arrays können Sie die Positions Argumente verwenden, die die einzige Anordnung bilden und sind die einzigen lokalen Variablen in Standard-Shell. Wickeln Sie das Überschreiben von Positions Argumente in einer Funktion, um die ursprünglichen Argumente an das Skript oder eine Funktion zu erhalten.

getsize() { set -- $(ls -dn "$1") && echo $5; }
getsize FILE

Dies teilt die Ausgabe von ln -dn nach aktuellen IFS Einstellungen der Umgebungsvariablen, ordnet sie Positionsargumente und erinnert an den fünften. Die -d sorgt für Verzeichnisse richtig gehandhabt und die -n stellt sicher, dass Benutzer- und Gruppennamen müssen nicht gelöst werden, anders als bei -l. Auch Benutzer- und Gruppennamen Leerzeichen enthalten, könnten theoretisch die erwartete Linienstruktur brechen; sie sind in der Regel nicht zulässig, aber diese Möglichkeit macht immer noch den Programmierer stoppen und zu denken.

Sie find Befehl verwenden, können einige Reihe von Dateien zu erhalten (hier temporäre Dateien extrahiert werden). Dann können Sie du Befehl verwenden, um die Dateigröße jeder Datei in lesbarer Form mit -h Schaltern zu erhalten.

  

find $HOME -type f -name "*~" -exec du -h {} \;

OUTPUT:

4.0K    /home/turing/Desktop/JavaExmp/TwoButtons.java~
4.0K    /home/turing/Desktop/JavaExmp/MyDrawPanel.java~
4.0K    /home/turing/Desktop/JavaExmp/Instream.java~
4.0K    /home/turing/Desktop/JavaExmp/RandomDemo.java~
4.0K    /home/turing/Desktop/JavaExmp/Buff.java~
4.0K    /home/turing/Desktop/JavaExmp/SimpleGui2.java~

Sie erstes Perl Beispiel mir nicht aussehen unvernünftig.

Es ist aus Gründen wie diese, die ich vom Schreiben von Shell-Skripten migriert (in bash / sh etc.) für alle, aber die meisten trivial Skripte in Perl zu schreiben. Ich fand, dass ich mit für bestimmte Anforderungen Perl zu starten, und wie ich es tat, dass mehr und mehr erkannte ich, dass die Skripte in Perl zu schreiben war wahrscheinlich ein mächtiger (in Bezug auf die Sprache und die breite Palette von Bibliotheken über < a href = "http://www.cpan.org" rel = "nofollow noreferrer"> CPAN ) und effizientere Art und Weise zu erreichen, was ich wollte.

Hinweis

, dass andere Shell-Skript-Sprachen (zum Beispiel Python / Rubin) wird ohne Zweifel ähnliche Einrichtungen haben, und Sie können diese für Ihre Zwecke auswerten möchten. Ich Perl nur diskutieren, da das ist die Sprache, die ich verwende und bin vertraut mit.

Wenn Sie Perl auf Ihrem Solaris haben, verwenden Sie es dann. Ansonsten ls mit awk ist Ihre nächste beste Wette, da Sie nicht stat haben Sie oder Ihre Entdeckung ist nicht GNU finden.

Es gibt einen Trick in Solaris ich verwendet habe, wenn Sie für die Größe von mehr als einer Datei fragen sie ohne Namen nur die Gesamtgröße gibt - so eine leere Datei enthalten wie / dev / null als zweite Datei:

eg     Befehl fileyouwant / dev / null

Ich kann nicht, welche Größe Befehl funktioniert dies für ls / WC / etc rememebr -. Leider Ich habe keinen solaris Box zu testen

auf Linux Sie du -h $FILE verwenden können, funktioniert das auf solaris auch?

Haben Sie versucht, mich -ks | awk '{print $ 1 * 1024}'. Das könnte funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top