获取可以与 touch -m 一起使用的修改日期

获取可以与 touch -m 一起使用的修改日期

我需要获取文件的修改日期,以便我可以使用touch -m.

stat或者perl -le 'print((stat shift)[9])'没有返回我想要的东西。我认为你应该使用 - 和 + 但我不确定如何正确使用它。

我虽然使用-tI虽然它可以以另一种方式设置它,但这里我尝试将其设置为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从参考文件中解析出修改时间戳,但touchmacOS 上的实用程序可以通过使用以下命令自行完成此操作-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

相关内容