Как получить данные предыдущей даты в сценарии оболочки?

За исключением некоторых BSD, xargs cmdпо-прежнему запускает cmdодин раз без аргументов, когда ввод пуст. GNUxargs(реализация, которая также представила -0), имеет опцию -r(, которая теперь также поддерживается несколькими другими реализациями ), чтобы избежать этого.

Теперь есть несколько других проблем с вашим подходом:

  • если имеется большое количество файлов, xargsбудет запускаться ls -tнесколько раз, поэтому вы не получите последний файл, а только последний из первого пакета
  • вы не передаете параметр -dв ls, что означает, что если какой-либо из этих файлов относится к типу каталога , их содержимое будет указано.
  • вы используете -print0/ xargs -0, что позволяет обрабатывать произвольные имена файлов, но это не работает, когда вы используете ls -t, который больше не выводит список файлов с разделителями NUL -.

Здесь вы можете использовать zshтам, где это становится тривиальным:

newest=(/mnt/synology/bk/bk-*(Nmh-1om[1]))
if (($#newest)); then
  printf 'Newest: %s\n' $newest
else
  echo none found
fi

Или с GNU find(, который вы, вероятно, используете, так как -maxdepthи -mminявляются расширениями GNU )и sort/cut/headреализации поддержки символов NUL в их вводе:

find /mnt/synology/bk -mindepth 1 -maxdepth 1 \
                      -name 'bk-*' -mmin -60 -printf '%T@/%p\0' |
  tr '\n\0' '\0\n' |
  sort -rn |
  cut -d/ -f2- |
  head -n1 |
  tr '\0' '\n'
Однако

(обратите внимание, что, в отличие от zsh, findможет не найти некоторые bk-*файлы, если часть после bk-содержит последовательности байтов, которые не образуют допустимые символы ).

0
16.04.2020, 08:10
1 ответ

В вашем случае я бы определенно ограничил запрос таким образом, чтобы вы получали записи за один день независимо от того, когда запрос запущен. Таким образом, вы можете начать его в 2 часа ночи или когда угодно. Таким образом, вы сможете запустить скрипт позже вручную, если что-то пошло не так в то время, когда он должен был выполняться.

В вашем скрипте измените условие where на что-то вроде этого:

where DATE(posting_date) = DATE(DATE_ADD(CURDATE(), INTERVAL -1 DAY))

Таким образом, вы получите только те записи, которые датированы вчерашним днем.

Если вы хотите сделать это с помощью переменных bash, получите текущую дату в форме, подходящей для MySql:

date=$(date --rfc-3339=date)

Вывод для $dateимеет форму, распознаваемую для MySql:

2020-04-16

Затем создайте условие where примерно так:

where DATE(posting_date) = DATE(DATE_ADD('$date', INTERVAL -1 DAY))

Если вы измените interval -1 day, вы сможете получить данные за любой день.


И еще одно. Не предоставляйте имена пользователей и пароли MySql из скриптов. Таким образом, пароли раскрываются, и рано или поздно вы пожалеете об этом. Используйте mysql_config_editor(https://dev.mysql.com/doc/refman/8.0/en/mysql-config-editor.html), чтобы сохранить учетные данные и использовать их позже в сценарии, подобном вашему.

0
19.03.2021, 02:28

Теги

Похожие вопросы