我需要获取文件的修改日期,以便我可以使用touch -m
.
stat
或者perl -le 'print((stat shift)[9])'
没有返回我想要的东西。我认为你应该使用 - 和 + 但我不确定如何正确使用它。
我虽然使用-t
I虽然它可以以另一种方式设置它,但这里我尝试将其设置为2013年7月3日。
touch -t 20130703
但这也没有按照我想要的方式改变它。那么回到问题,如何复制其他文件属性以便我可以使用 来设置它们touch -m
?
答案1
stat
您可以使用命令将or返回的时间转换perl
为您想要的格式date
(假设您安装了 GNU coreutils):
# Convert UNIX time returned by perl to year+month+day
$ date -d @$(perl -le 'print((stat shift)[9])' FILENAME) +%Y%m%d
20130703
# Convert formatted time returned by GNU stat to year+month+day
$ date -d "$(stat -c %y FILENAME)" +%Y%m%d
20130703
date
它本身也可以直接给你文件的修改时间:
$ date -r FILENAME +%Y%m%d
20130703
有关详细信息,请参阅GNU 日期的手册页( man date
)。
答案2
stat -f %m -t %Y%m%d%H%M.%S myfile
这会以 所需的格式打印时间戳touch -t
。
请注意,时间戳是用本地时区表示的,这对于在时区之间移植文件或在具有 DST 的时区中夏季到冬季切换的重复小时内的时间戳可能会很尴尬。为了避免时区问题,请使用 UTC 时间戳:
timestamp=$(TZ=UTC stat -f %m -t %Y%m%d%H%M.%S myfile)
…
TZ=UTC touch -t "$timestamp" myotherfile
请注意,这适用于 BSDstat
实用程序(例如 OSX 附带的实用程序),而不适用于 GNU 或 BusyBoxstat
实用程序(例如 Linux 上的实用程序)。
答案3
执行“ls -otr --time-style=+%Y%m%d%H%M.%S”将以正确的格式获取日期,尽管还有一堆可以轻松编辑的其他信息。
当分配给别名并将输出重定向到文件时,这很方便。
答案4
由于问题被标记为操作系统,我将假设用户使用的是 macOS。
macOS 上的实用程序touch
能够在使用其-m
选项时设置文件的修改时间戳。现在的问题是找到一种方法,touch -m
使用某个单独的文件作为“参考文件”来设置多个文件的修改时间戳。
用户建议使用stat
从参考文件中解析出修改时间戳,但touch
macOS 上的实用程序可以通过使用以下命令自行完成此操作-r file
:
touch -m -r reference_file file1 file2 file3
file1
上面的命令将、file2
和的修改时间戳设置file3
为与名为 的文件上的修改时间戳相同的时间戳reference_file
。
如果用户想要跟踪某处文件或目录的原始时间戳(正如提到的那样)在评论中),为了以后能够恢复它,他们可以简单地创建一个空文件并设置时间戳,touch -m
如上所述,使用-r
.任何时候都不需要从 中解析出时间戳stat
。
# create an empty file to hold the original timestamp
touch -m -r original empty
# do stuff to the original
# restore timestamp on the original
touch -m -r empty original
rm empty