
У меня есть скрипт 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" ;; есак