Bash Script, busca el tamaño del archivo y compara si no se ejecuta

Bash Script, busca el tamaño del archivo y compara si no se ejecuta

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 18607414901bytes, es decir, 18 GB.

Lo que quiero es ejecutar el comando si tiene menos de 60 GB. El echocomando 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 wcel comando con -cla 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 statel comando con -cla 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*.gzenumerará todos los archivos en orden inverso por marca de tiempo. El último es el más nuevo. tail -n 1mostrará 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, 0ejecutará 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

información relacionada