我有一个 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" ;; 埃萨克