这似乎是各种平台上非标准功能的经典案例。
很简单,我想要一种普遍(或至少广泛)支持的方法,将文件的修改时间作为unix时间戳,以秒为单位。
现在我知道使用stat
执行此操作的各种方法,但大多数都是特定于平台的;例如stat -c %Y $file
适用于某些人,但不适用于使用stat -f %m $file
的OS X(以及可能是其他FreeBSD系统)。
同样,某些平台支持date -r $file +%s
,但OS X / FreeBSD再次没有,因为-r
选项似乎只是使用+%s
来获取unix时间戳的替代方案,而是比其他平台上的参考文件选项。
我熟悉的另一个选择是将find
与-printf
选项一起使用,但这并不是广泛支持的。我所知道的最后一种方法是解析ls
,除了是一件令人不快的事情之外,我认为不能(或者至少应该)依赖它。
那么,是否有更兼容的方法来获取文件的修改时间?目前我只是将stat
的不同变体放入一个脚本并运行它们,直到一个退出状态为零,但这远非理想,即使我将成功命令缓存到将来先运行。 / p>
答案 0 :(得分:7)
由于似乎可能没有“正确”的解决方案,我认为我会发布当前的一个用于比较:
if stat -c %Y . >/dev/null 2>&1; then
get_modified_time() { stat -c %Y "$1" 2>/dev/null; }
elif stat -f %m . >/dev/null 2>&1; then
get_modified_time() { stat -f %m "$1" 2>/dev/null; }
elif date -r . +%s >/dev/null 2>&1; then
get_modified_time() { stat -r "$1" +%s 2>/dev/null; }
else
echo 'get_modified_time() is unsupported' >&2
get_modified_time() { printf '%s' 0; }
fi
[编辑]
我正在更新这个以反映我使用的代码的更新版本,基本上它测试两个主要stat
方法和一个有点常见的date
方法,任何尝试获取修改时间当前的工作目录,如果其中一个方法成功,它会创建一个封装它的函数,以便稍后在脚本中使用。
这个方法与我之前发布的方法不同,因为它总是进行一些处理,即使从未调用过get_modified_time
,但如果你确实需要在大多数时间调用它,那么整体效率会更高。它还允许您在之前捕获不受支持的平台。
如果您更喜欢仅在调用时测试函数的函数,那么这是另一种形式:
get_modified_time() {
modified_time=$(stat -c %Y "$1" 2> /dev/null)
if [ "$?" -ne 0 ]; then
modified_time=$(stat -f %m "$1" 2> /dev/null)
if [ "$?" -ne 0 ]; then
modified_time=$(date -r "$1" +%s 2> /dev/null)
[ "$?" -ne 0 ] && modified_time=0
fi
fi
echo "$modified_time"
}
答案 1 :(得分:0)
只需询问操作系统的名称,然后从那里开始。或者,编写一个C程序,或使用Python或其他非常常见且更标准化的东西:How to get file creation & modification date/times in Python?
答案 2 :(得分:0)
为什么这么复杂?
在网上找不到任何东西后,我只读了ls的手册
man ls
这给了我
ls --time-style=full-iso -l
,并以hh:mm:ss.sssssssss
格式更改时间
为
ls --time-style=+FORMAT -l
同时使用FORMAT
和日期(请参阅man date
)
ls --time-style=+%c
将为您提供本地日期和时间,以秒为整数(不带小数点)。
通过awk
传递管道时,您可以删除其他ls信息(例如,文件名,所有者...)。