
Muy nuevo en bash, como verá en el código a continuación.
Quiero obtener el tamaño del archivo en bytes, compararlo con un valor fijo y enviar un correo electrónico si este último es demasiado pequeño.
Código:
#!/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
La salida del comando anterior es 18607414901
bytes, es decir, 18 GB.
Lo que quiero es ejecutar el comando si tiene menos de 60 GB. El echo
comando se usa solo para probar eso.
./backupsql.sh: line 4: [: missing `]'
Respuesta1
Necesitas algunos espacios en la prueba:
if [ $f -lt 60000000000 ] ;then
echo "Hello"
fi
Respuesta2
Puede usar wc
el comando con -c
la opción (imprimir los recuentos de bytes) para obtener el tamaño del archivo en bytes para realizar una mayor comparación:
#!/bin/bash
s=$(wc -c < /var/lib/xxxxxx/backups/xxxxxxxxDB*.gz)
if [ $s -lt 60000000000 ]; then
echo "hello"
fi
Otra forma es usar stat
el comando con -c
la opción:
#!/bin/bash
s=$(stat -c "%s" /var/lib/xxxxxx/backups/xxxxxxxxDB*.gz)
if [ $s -lt 60000000000 ]; then
echo "hello"
fi
-c
- le dice que use el formato especificado
%s
- el formato que representa el tamaño total, en bytes
Respuesta3
¿Guion? Aquí hay una sola línea:
[ $(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
enumerará todos los archivos en orden inverso por marca de tiempo. El último es el más nuevo. tail -n 1
mostrará el último archivo. $(..)
es el texto de un comando. stat -c %s <file>
mostrará el tamaño de un archivo. [ ... ]
es en realidad el comando /usr/bin/test si el código de retorno es, 0
ejecutará el comando después &&
.
Si ejecuta este comando en crontab, debe escapar %
con \
, como[ $(stat -c \%s ..
La versión del guión:
#! /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