Bash-Skript, Dateigröße ermitteln und vergleichen läuft nicht

Bash-Skript, Dateigröße ermitteln und vergleichen läuft nicht

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 18607414901Bytes, also 18 GB.

Ich möchte den Befehl ausführen, wenn er kleiner als 60 GB ist. Der echoBefehl 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 wcden Befehl mit -cder 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 stateines Befehls mit -cOption:

#!/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*.gzlistet alle Dateien in umgekehrter Reihenfolge nach Zeitstempel auf. Die letzte ist die neuste. tail -n 1zeigt 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, 0wird 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

verwandte Informationen