Узнайте, выполнялось ли резервное копирование, выполнив поиск самого нового файла - PullRequest
0 голосов
/ 26 марта 2020

Я хотел бы написать короткий и простой скрипт, который ищет файл с использованием специального фильтра c и проверяет возраст этого файла. Я хочу написать короткий вывод и код ошибки. Это должно быть доступно для NRPE-сервера.

Сам скрипт работает, но у меня проблема только тогда, когда файл не существует. Это происходит с этой командой:

newestfile=$(ls -t $path/$filter | head -1)

Когда файлы существуют, все работает как надо. Когда ничто не соответствует моему фильтру, я получаю вывод (я изменил фильтр на * .zip, чтобы показать):

ls: cannot access '/backup/*.zip': No such file or directory

Но я хочу получить следующий вывод, а затем просто выйти из сценария с кодом 1 :

there are no backups with the filter *.zip in the directory /backup

Я почти уверен, что это очень простая проблема, но я просто не знаю, что случилось. Кстати, я все еще "новичок" в сценариях bash.

Вот весь мой код:

#!/bin/bash
# Set the variables
path=/backup
filter=*.tar.gz

# Find the newest file
newestfile=$(ls -t $path/$filter | head -1)

# check if we even have a file
if [ ! -f $newestfile ]; then
  echo "there are no backups with the filter $filter in the directory $path"
  exit 1
fi

# check how old the file is that we found
if [[ $(find "$newestfile" -mtime +1 -print) ]]; then
  echo "File $newestfile is older than 24 hours"
  exit 2
else
  echo "the file $newestfile is younger than 24 hours"
  exit 0
fi

1 Ответ

0 голосов
/ 26 марта 2020

На самом деле, с вашим кодом вы также должны получить сообщение об ошибке bash: нет совпадения: /backup/*.zip

ОБНОВЛЕНИЕ: Исправлено предлагаемое решение и пропущено цитаты в исходном решении:

Я предлагаю следующий подход:

shopt -u failglob # Turn off error from globbing
pathfilter="/backup/*.tar.gz" # Quotes to avoid the wildcards to be expanded here already

# First see whether we have any matching files
files=($pathfilter)

if [[ ! -e ${#files[0]} ]]
then
  # .... No matching files
else
  # Now you can safely fetch the newest file
  # Note: This does NOT work if you have filenames
  # containing newlines
  newestfile=$(ls -tA $pathfilter | head -1)
fi

Мне не нравится использовать ls для этой задачи, но я не вижу простого пути в bash чтобы сделать это лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...