我结合使用 stat
和 touch
来获取/设置文件和目录的时间戳。但如果在 mac os x 或 GNU/Linux 上,我需要不同的设置:
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]
。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
。
最佳答案
没有更好的方法,我暂时采用下面的方法,这是基于这些观察:
touch -t
在我的 mac os x 和我也可以访问的 Linux 上工作相同。在 Linux 端,我可以使用
date -d
将stat -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/