Ich habe ein Skript, das nach der Größe 0 sucht, aber ich dachte, es muss eine einfachere Möglichkeit geben, stattdessen nach Dateigrößen zu suchen. Dh file.txt
ist normalerweise 100k; So überprüfen Sie, ob ein Skript weniger als 90 KB (einschließlich 0) enthält, und lassen es eine neue Kopie erstellen, da die Datei in diesem Fall beschädigt ist.
Was ich gerade benutze ..
if [ -n file.txt ]
then
echo "everything is good"
else
mail -s "file.txt size is zero, please fix. " myemail@gmail.com < /dev/null
# Grab wget as a fallback
wget -c https://www.server.org/file.txt -P /root/tmp --output-document=/root/tmp/file.txt
mv -f /root/tmp/file.txt /var/www/file.txt
fi
Antworten:
[ -n file.txt ]
Überprüft nicht die Größe, sondern, ob die Zeichenfolgefile.txt
nicht Null ist, sodass sie immer erfolgreich ist.Wenn Sie sagen möchten, dass "Größe nicht Null ist", benötigen Sie
[ -s file.txt ]
.Um die Größe einer Datei zu ermitteln, können Sie
wc -c
die Größe (Dateilänge) in Byte ermitteln:In diesem Fall klingt es so, als ob Sie das wollen.
Wenn Sie jedoch wissen möchten, wie viel Speicherplatz die Datei verwendet, können Sie
du -k
die Größe (verwendeter Speicherplatz) in Kilobyte ermitteln:Wenn Sie mehr Kontrolle über das Ausgabeformat benötigen, können Sie sich auch ansehen
stat
. Unter Linux würden Sie mit so etwas beginnenstat -c '%s' file.txt
und unter BSD / Mac OS X mit so etwasstat -f '%z' file.txt
.quelle
du -b "$file" | cut -f 1
stattstat -c '%s' "$file"
? Oderstat --printf="%s" "$file"
?stat
haben unterschiedliche Flags.... | cut -d' ' -f1
, damit es unter Ubuntu funktioniert.wc -c < "$file"
(beachten Sie das<
). In diesem Fall benötigen Sie das| cut ...
Teil nicht (was, wie angegeben, unter OSX nicht funktioniert). Der MindestwertBLOCKSIZE
fürdu
unter OSX ist512
.wc -c <filename
auchfstat
undseek
? Beachten Sie, dassfstat
ein fd und kein Pfadname verwendet wird.Es überrascht mich, dass niemand erwähnt hat
stat
, um die Dateigröße zu überprüfen. Einige Methoden sind definitiv besser: Es-s
ist einfacher als alles andere, herauszufinden, ob die Datei leer ist oder nicht, wenn das alles ist, was Sie wollen. Und wenn Sie Dateien mit einer Größe suchen möchten ,find
ist dies mit Sicherheit der richtige Weg.Ich mag es auch
du
sehr, die Dateigröße in KB zu erhalten, aber für Bytes würde ich Folgendes verwendenstat
:quelle
stat
ist eine großartige Idee, aber unter CentOS hat dies für mich funktioniert:size=$(stat -c%s $filename)
stat
, dass es in einigen Situationen das Richtige ist, und spärliche Dateien sind in den meisten Situationen nicht relevant, wenn auch sicherlich nicht in allen.alternative lösung mit awk und doppelter klammer:
quelle
du
es nicht unterstützt wird-b
. (Es kann eine bewusste Stil Wahl, aber nur die Alternative zu erwähnen: Sie weglassen können$
Präfix innerhalb(( ... ))
wenn Variablen Referenzierung:((SIZE<90000))
)$
awk
mitread
(bash
internen Befehl)read SIZE _ <<<$(du -sb "$FILENAME")
Wenn Sie
find
mit dieser Syntax umgehen, können Sie sie verwenden:Dies wird
file.txt
nur dann an stdout ausgegeben , wenn die Größe vonfile.txt
weniger als 90 KB beträgt. So führen Sie ein Skript aus,script
wennfile.txt
es eine Größe von weniger als 90 KB hat:quelle
find . -maxdepth 1 -name "file.txt" -size -90k
Wenn Sie nur die Größe einer Datei suchen:
quelle
wc -c "$file"
wurde als Antwort im Jahr 2011 (vor drei Jahren) gegeben. Ja, eswc -c "$file"
besteht das Problem, dass sowohl der Dateiname als auch die Anzahl der Zeichen ausgegeben werden. In den ersten Antworten wurde daher ein Befehl zum Trennen der Anzahl hinzugefügt. Aberwc -c < "$file"
was dieses Problem behebt, wurde im Mai 2014 als Kommentar hinzugefügt. Ihre Antwort entspricht dieser, außer dass sie eine „nutzlose Verwendung voncat
“ hinzufügt . Außerdem sollten Sie alle Shell-Variablenreferenzen zitieren, es sei denn, Sie haben einen guten Grund, dies nicht zu tun.Dies funktioniert sowohl unter Linux als auch unter MacOS
quelle
stat scheint dies mit den wenigsten Systemaufrufen zu tun:
quelle
strace du --bytes $1 2>&1 >/dev/null | wc
Wenn dies der Fall ist, habe ich auf der amd64-Architektur unter ArchLinux (normalerweise die neuesten Versionen von allem) 45 Zeilen fürdu
, 46 Zeilen fürstat
, 47 Zeilen fürwc
und 72 Zeilen fürfind
.Portable, alle Arten von Python, vermeidet Variationen in statischen Dialekten
quelle
Um die Dateigröße sowohl unter Linux als auch unter Mac OS X (und vermutlich auch unter anderen BSDs) zu ermitteln, gibt es nicht viele Optionen, und die meisten der hier vorgeschlagenen funktionieren nur auf einem System.
Gegeben
f=/path/to/your/file
,Was funktioniert sowohl in Linux als auch in Macs Bash:
oder
Die anderen Antworten funktionieren gut unter Linux, aber nicht unter Mac:
du
hat-b
auf dem Mac keine Option und der Trick BLOCKSIZE = 1 funktioniert nicht ("Mindestblockgröße 512", was zu einem falschen Ergebnis führt)cut -d' ' -f1
funktioniert nicht, da auf dem Mac die Nummer möglicherweise rechtsbündig und mit Leerzeichen vorne aufgefüllt ist.Wenn Sie also etwas Flexibles benötigen, ist es entweder
perl
der-s
Operator oder einewc -c
Weiterleitungawk '{print $1}'
(awk ignoriert den führenden Leerraum).Verwenden Sie für den Rest Ihrer ursprünglichen Frage natürlich den Operator
-lt
(oder-gt
):if [ $size -lt $your_wanted_size ]; then
etc.quelle
size=$(wc -c < "$f")
(beachten Sie<
, dasswc
nur eine Zahl gemeldet wird). Zum Vergleich: Vergessen Sie nicht das "Bash-Ful"if (( size < your_wanted_size )); then ...
(und auch[[ $size -lt $your_wanted_size ]]
).Basierend auf der Antwort von gniourf_gniourf,
schreibt
file.txt
genau dann in stdout, wenn die Größe vonfile.txt
weniger als 90 KB beträgt, undführt den Befehl aus,
command
wennfile.txt
die Größe kleiner als 90 KB ist. Ich habe dies unter Linux getestet. Vonfind(1)
,(Betonung hinzugefügt).
quelle
Angenommen, der Befehl ls meldet die Dateigröße in Spalte 6
quelle
Ich würde
du
's--threshold
dafür verwenden. Ich bin nicht sicher, ob diese Option in allen Versionen von verfügbar istdu
, sie ist jedoch in der GNU-Version implementiert.Zitat aus dem Handbuch von du (1) :
Hier ist meine Lösung
du --threshold=
für den Anwendungsfall von OP:Der Vorteil davon ist , dass
du
ein Argument zu dieser Option in einem bekannten Format akzeptieren kann - entweder menschlich wie in10K
,10MiB
oder was auch immer Sie sich wohl fühlen mit - Sie müssen nicht zwischen verschiedenen Formaten / Einheiten seit manuell konvertieren müssen ,du
dass Griffe.Als Referenz finden Sie hier die Erklärung zu diesem
SIZE
Argument auf der Manpage:quelle
du
, die dies nicht unterstützen. Die--threshold
Option wurde in Coreutils 8.21 hinzugefügt, das 2013 veröffentlicht wurde .Okay, wenn Sie auf einem Mac sind, machen Sie Folgendes:
stat -f %z "/Users/Example/config.log"
Das war's!quelle