FreeBSD 日期实用程序 -r 开关让我感到困惑

FreeBSD 日期实用程序 -r 开关让我感到困惑

我有一个 bash 脚本,需要将其从 linux 转换为 FreeBSD,但我显然太愚蠢了,无法以正确的方式阅读手册页。

该脚本有一行:

date +%d -r "$file"

在linux下工作得很好,但只是给出

date: illegal time format

在 FreeBSD 上。

Linux 手册页表示-r用于指定引用文件:

   -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。如果它应该从调用的上下文中推断出来,我对如何提供此上下文感到困惑。

谁能向我解释一下,我应该如何告诉日期实用程序,-r我想在这里使用开关的哪种用例?

答案1

看起来这个-r用法只出现在来源中2015 年 5 月 7 日。也许您的版本还没有这样做?

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" ;;
埃萨克

相关内容