Утилита даты FreeBSD -r сбивает меня с толку

Утилита даты FreeBSD -r сбивает меня с толку

У меня есть скрипт bash, который мне нужно преобразовать из Linux во FreeBSD, но я, очевидно, слишком глуп, чтобы как следует прочитать страницу руководства.

В сценарии есть строка:

date +%d -r "$file"

который отлично работает под Linux, но просто дает

date: illegal time format

на FreeBSD.

Theстраница руководства Linuxговорит, что -rиспользуется для указания файла referencencre:

   -r, --reference=FILE
          display the last modification time of FILE

Что меня здесь озадачивает, так это то, чтоСтраница руководства FreeBSDсодержит то же самое использование этого переключателя, но также предоставляет альтернативный вариант:

 -r seconds
     Print the date and time represented by seconds, where seconds is
     the number of seconds since the Epoch (00:00:00 UTC, January 1,
     1970; see time(3)), and can be specified in decimal, octal, or
     hex.

 -r filename
     Print the date and time of the last modification of filename.

Очевидно, что приведенные выше сообщения об ошибках являются результатом ожидания метки времени UNIX в качестве параметра для -rпереключателя вместо предоставленного имени файла.

Чего я не понимаю, так это как я должен дать понять, что я хочу использовать вторую интерпретацию переключателя -r. Если это должно быть выведено из контекста вызова, я не понимаю, как предоставить этот контекст.

Может ли кто-нибудь объяснить мне, как мне сообщить утилите date, какой вариант использования переключателя -rя хочу здесь использовать?

решение1

Похоже, это -rиспользование попало только в источники7 мая 2015 г.. Возможно, ваша версия пока этого не делает?

Revision 282608 - (view) (download) (annotate) - [select for diffs] 
Modified Thu May 7 20:54:38 2015 UTC (12 months, 1 week ago) by delphij 

date(1): Make -r behave like GNU's version when the option can not be
interpreted as a number, which checks the file's modification time and
use that as the date/time value.

решение2

В сценарии есть строка:

дата +%d -r "$file"
который отлично работает под Linux, но…

… на FreeBSD/PC-BSD завершится ошибкой, поскольку dateкоманда анализирует свои командные строки с getopt()параметрами, которые должны строго предшествовать аргументам. Строка формата +%dявляется аргументом и должна следовать за -rпараметром; в противном случае -rне распознается как параметр, а рассматривается как (недопустимый) аргумент. Обратите внимание, что синопсис команды на dateстранице руководства отображает их именно в этом порядке.

Да, dateрассматривает аргументы опции -rкак имена файлов только тогда, когда не может декодировать их как числа. Да, это проблема, когда имена файлов являются числами. ☺

Лучшим подходом для чтения времени последнего изменения файла/каталога, не беспокоясь о том, похоже ли его имя на число или нет, была бы команда stat…, если бы она сама по себе не имела существенных трудностей.

случай "`uname`" в
Linux) stat -c '%y' -- "$1"|cut -c9-10 ;;
*BSD) stat -f '%Sm' -t '%d' -- "$1" ;;
есак

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