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上,我需要不同的设置:
touch
不知道此处描述的-d
选项
这使得
touch -d "2007-11-12 10:15:30.002Z" ajosey
我似乎被限制在-t[[CC]YY]MMDDhhmm[.SS]
stat
也不同,例如在我的一个Linux帐户上,它无法识别mac os x上的stat
的-t格式
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和我可以访问的Linuxdate-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