За исключением некоторых 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-
содержит последовательности байтов, которые не образуют допустимые символы ).
В вашем случае я бы определенно ограничил запрос таким образом, чтобы вы получали записи за один день независимо от того, когда запрос запущен. Таким образом, вы можете начать его в 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), чтобы сохранить учетные данные и использовать их позже в сценарии, подобном вашему.