
Ganz neu bei Bash, wie Sie im Code unten sehen werden.
Ich möchte die Dateigröße einer Datei in Bytes ermitteln, diese mit einem festen Wert vergleichen und eine E-Mail senden, wenn dieser zu klein ist.
Code:
#!/bin/bash
f=$(find /var/lib/xxxxxx/backups/xxxxxxxxDB*.gz -ctime 0 -print -exec ls -l {} \; | awk '{print $5}')
if [$f -lt 60000000000] ; then
echo "hello";
fi
Die Ausgabe des obigen Befehls beträgt 18607414901
Bytes, also 18 GB.
Ich möchte den Befehl ausführen, wenn er kleiner als 60 GB ist. Der echo
Befehl wird nur verwendet, um das zu testen.
./backupsql.sh: line 4: [: missing `]'
Antwort1
Sie benötigen einige Leerzeichen im Test:
if [ $f -lt 60000000000 ] ;then
echo "Hello"
fi
Antwort2
Sie können wc
den Befehl mit -c
der Option (Drucken Sie die Byte-Anzahl), um die Dateigröße in Bytes für weitere Vergleiche zu erhalten:
#!/bin/bash
s=$(wc -c < /var/lib/xxxxxx/backups/xxxxxxxxDB*.gz)
if [ $s -lt 60000000000 ]; then
echo "hello"
fi
Eine andere Möglichkeit ist die Verwendung stat
eines Befehls mit -c
Option:
#!/bin/bash
s=$(stat -c "%s" /var/lib/xxxxxx/backups/xxxxxxxxDB*.gz)
if [ $s -lt 60000000000 ]; then
echo "hello"
fi
-c
- weist an, das angegebene Format zu verwenden
%s
- das Format, das die Gesamtgröße in Bytes darstellt
Antwort3
Skript? Hier ist ein Einzeiler:
[ $(stat -c %s $(ls -tr /var/lib/xxxxxx/backups/xxxxxxxxDB*.gz | tail -n 1)) -lt 60000000000 ] && echo "Error" | mail -s "Too small" [email protected]
ls -tr /var/lib/xxxxxx/backups/xxxxxxxxDB*.gz
listet alle Dateien in umgekehrter Reihenfolge nach Zeitstempel auf. Die letzte ist die neuste. tail -n 1
zeigt die letzte Datei an. $(..)
ist der Text eines Befehls. stat -c %s <file>
zeigt die Größe einer Datei an. [ ... ]
ist eigentlich der Befehl /usr/bin/test. Wenn der Rückgabecode lautet, 0
wird der Befehl nach ausgeführt &&
.
Wenn Sie diesen Befehl in crontab ausführen, müssen Sie %
mit escapen \
, wie[ $(stat -c \%s ..
Die Skriptversion:
#! /bin/bash
LASTFILE=$(ls -tr /var/lib/xxxxxx/backups/xxxxxxxxDB*.gz | tail -n 1)
if [ $(stat -c %s $LASTFILE) -lt 60000000000 ]; then
echo "$LASTFILE" | mail -s "Too small" [email protected]
fi