Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何从(bash)脚本以跨平台的方式获取/设置修改时间?_Linux_Macos_Bash_Stat - Fatal编程技术网

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

Linux 如何从(bash)脚本以跨平台的方式获取/设置修改时间?,linux,macos,bash,stat,Linux,Macos,Bash,Stat,我结合使用stat和touch来获取/设置文件和曲目的时间戳。但如果在mac os x或GNU/Linux上,我需要不同的设置: mac os x上的touch不知道此处描述的-d选项 这使得 touch -d "2007-11-12 10:15:30.002Z" ajosey 我似乎被限制在-t[[CC]YY]MMDDhhmm[.SS] stat也不同,例如在我的一个Linux帐户上,它无法识别mac os x上的stat的-t格式 因此,在Linux上,我现在做的事情如下 stat --

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

  • mac os x上的
    touch
    不知道此处描述的
    -d
    选项

    这使得

    touch -d "2007-11-12 10:15:30.002Z" ajosey
    
    我似乎被限制在
    -t[[CC]YY]MMDDhhmm[.SS]

  • stat
    也不同,例如在我的一个Linux帐户上,它无法识别mac os x上的
    stat
    -t格式

  • 因此,在Linux上,我现在做的事情如下

    stat --format 'touch -d "%y" "%n"' index.html
    
    创建以下类型的命令行的步骤

    touch -d "2015-04-08 00:38:51.940365000 +0200" "index.html"
    
    而在MacOSX上,我有

    stat -f "touch -t %Sm \"%N\"" -t %Y%m%d%H%M.%S index.html
    
    这给了我一些东西(这与之前的
    index.html
    不同),比如:

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

    我需要生成一系列
    touch
    命令,其格式在两种平台上都能工作。创建此序列必须在两个平台上都有效


    我对bash以外的其他脚本持开放态度,但在Linux端,我使用的是一个没有管理员权限的系统
    perl
    这是为x86_64-linux-thread-multi构建的perl,v5.10.1(*)

    在Mac上安装,您就可以不再担心不兼容了。它解释了如何做到这一点。

    如果没有更好的方法,我将根据这些观察结果暂时采用以下方法:

  • touch-t
    同样适用于我的mac os x和我可以访问的Linux

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

  • 对于保留库中文件的批处理,我使用
    stat
    *
    shell扩展,我可以用
    For
    shell循环替换它

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

    #!/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
    用于不遵循符号链接,在mac os x上,它意味着
    -c
    不创建不存在的文件,我不确定GNU/Linux上的
    -h
    是否也暗示了
    -c

    我认为您只需要编写一个条件/开关
    uname-o
    ?(
    如果[$(uname-o)==linux];那么
    …)您可以删除时区。它不会被写入文件系统:@JeffY我希望GNU/Linux的通用代码,比如Ubuntu和Mac OS X。。。作为最后手段,保持有条件。即使使用v条件,我也需要能够在Linux上创建一系列适用于Mac OS的命令,反之亦然。@ceving ok,谢谢你的链接,但这也不会有什么坏处。@jfbu这样做会有坏处,因为它是不兼容列表中的一项:“我似乎被限制在
    -t[[CC]YY]MMDDhhmm[.SS]
    ”。
    #!/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