linux - 如何从(bash)脚本以跨平台方式获取/设置修改时间?

标签 linux macos bash stat

我结合使用 stattouch 来获取/设置文件和目录的时间戳。但如果在 mac os x 或 GNU/Linux 上,我需要不同的设置:

  1. touch 在 mac os x 上不知道那里描述的 -d 选项

    http://pubs.opengroup.org/onlinepubs/9699919799/utilities/touch.html

    它允许类似的事情

    touch -d "2007-11-12 10:15:30.002Z" ajosey
    

    我似乎受限于 -t [[CC]YY]MMDDhhmm[.SS]

  2. stat 也不同,例如在我的 Linux 帐户上,它无法识别 stat 中的 -t 格式 > 在 mac os x 上。

因此在 Linux 上我目前正在做类似的事情

stat --format 'touch -d "%y" "%n"' index.html

创建命令行类型

touch -d "2015-04-08 00:38:51.940365000 +0200" "index.html"

而在 mac os x 上我有

stat -f "touch -t %Sm \"%N\"" -t %Y%m%d%H%M.%S index.html

这给了我一些东西(这与之前的 index.html 不同),例如:

touch -t 201503281339.42 "index.html"

如何统一处理?也许中间有一些 sed

我需要生成一系列 touch 命令,其格式适用于两个平台。此序列的创建必须适用于两个平台。

我对 bash 以外的其他脚本持开放态度,但在 Linux 方面我使用的是一个没有管理员权限的系统。 perl This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi

最佳答案

没有更好的方法,我暂时采用下面的方法,这是基于这些观察:

  1. touch -t 在我的 mac os x 和我也可以访问的 Linux 上工作相同。

  2. 在 Linux 端,我可以使用 date -dstat -c %y 生成的日期转换为 YYYYMMDDHHMM。 SS 格式我可以在 touch -t 的输入上使用,在 Mac OS X 端我可以直接使用 stat 并为此结果提供合适的选项。

对于汇辑中文件的批处理,我使用 stat* shell 扩展,我可以用 for 替换它外壳循环。

将这些东西放在一起,我以以下脚本结束:

#!/bin/sh                                                                       
case `uname -s` in
    "Linux" )
        MYDATEFORTOUCH() {
            date -d"$(stat -c %y "$1")" +%Y%m%d%H%M.%S
        }
        ;;
    "Darwin" )
        MYDATEFORTOUCH() {
            stat -f %Sm -t %Y%m%d%H%M.%S "$1"
        }
        ;;
    * )
        MYDATEFORTOUCH() {
            197001010000.00
        }
        ;;
esac

echo "#!/bin/sh" > fichierTEMPA

for file in *
do echo "touch -ch -t $(MYDATEFORTOUCH "$file") \"$file\"" >> fichierTEMPA
done

在目录中执行此操作会生成一个文件(此处的名称很傻 fichierTEMPA),它是一系列 touch -t 命令。 -h 用于不跟随符号链接(symbolic link),在 mac os x 上,它暗示 -c 不创建不存在的文件,我不是确定 -c 在 GNU/Linux 上是否也被 -h 暗示。

关于linux - 如何从(bash)脚本以跨平台方式获取/设置修改时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35155453/

相关文章:

linux - 连接时自动检测 USB 设备名称

linux - Play framework 2.2.1 应用程序以奇怪的 Killed 消息终止

iphone - 具有核心显卡的图像效果

C++:在 mac osx 上将 std::cout 与 gcc 一起使用

bash - 这个 bash 脚本有什么问题吗?

Linux 基础知识 - 自动执行脚本

c# - Dotnet 应用程序作为守护进程启动,无法正常工作

linux - Shell getopts 用于获取参数

linux - 不会分配伪终端,因为 stdin 不是终端

swift - 将包含多个文件路径的 Swift 字符串转换为 AppleScript 列表