Скрипт Bash, поиск размера файла и сравнение не работает

Скрипт Bash, поиск размера файла и сравнение не работает

Как вы увидите в коде ниже, я совсем новичок в bash.

Я хочу получить размер файла в байтах, сравнить его с фиксированным значением и отправить электронное письмо, если последнее слишком мало.

Код:

#!/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

Вывод команды выше — 18607414901байты, т.е. 18 ГБ.

Я хочу выполнить команду, если это меньше 60 ГБ. echoКоманда используется только для проверки этого.

./backupsql.sh: line 4: [: missing `]'

решение1

В тесте вам понадобятся пробелы:

if [ $f -lt 60000000000 ] ;then
    echo "Hello"
fi

решение2

Вы можете использовать wcкоманду с -cопцией (распечатать количество байтов) чтобы получить размер файла в байтах для дальнейшего сравнения:

#!/bin/bash

s=$(wc -c < /var/lib/xxxxxx/backups/xxxxxxxxDB*.gz)
if [ $s -lt 60000000000 ]; then
echo "hello"
fi

Другой способ — использование statкоманды с -cопцией:

#!/bin/bash

s=$(stat -c "%s" /var/lib/xxxxxx/backups/xxxxxxxxDB*.gz)
if [ $s -lt 60000000000 ]; then
echo "hello"
fi

-c- говорит использовать указанный формат

%s- формат, представляющий общий размер в байтах

решение3

Скрипт? Вот однострочный:

[ $(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выведет список всех файлов в обратном порядке по временной метке. Последний — самый новый. tail -n 1покажет последний файл. $(..)— это текст команды. stat -c %s <file>покажет размер файла. [ ... ]на самом деле это команда /usr/bin/test, если код возврата — 0то команда будет выполнена после &&.

Если вы запустите эту команду в crontab, вам придется использовать escape %, \например:[ $(stat -c \%s ..

Версия сценария:

#! /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

Связанный контент