我刚刚(今天31-jan-2019
)下载了一些随机的 source.tar.gz 并提取了它。当我stat
对生成的文件夹进行操作时,我看到:
Access: 2019-01-31 10:37:26.308991485 +0100
Modify: 2018-11-18 00:02:35.000000000 +0100
Change: 2019-01-31 10:36:03.881185889 +0100
Birth: -
修改日期已经过去了,在我拥有笔记本电脑之前。有人可以解释一下这个时间戳有什么用吗?
这是非常不直观的,我希望所有时间(更改/访问/修改)都限制在我的文件系统生命周期内。 (也是最有用的日期之一,即特定文件/文件夹首次出现的时间,不存在,但是是的,我知道我可以通过ext4上的出生是空的)
答案1
我的答案基于 GNU tar
,为此该手册可在此处获取。
tar
创建存档时保留文件的修改时间。这允许tar
执行取决于文件时间戳的某些操作。
- 第一个用途是“更新”操作:
-u
,--update
追加比存档中相应副本更新的文件。
从手册中:
该
--update
操作通过将指定归档成员的日期与同名文件的日期进行比较来更新 tar 归档。如果该文件的修改时间比存档成员更新,则该文件的较新版本将添加到存档中(与 一样--append
)。
请注意,更新操作实际上会导致文件被附加,而不是被覆盖。这是由于历史原因,即写入磁带中间部分的困难。
- 第二种用途是提取磁盘上已存在的文件的存档。如果现有文件较新,您可以使用
tar
以下选项要求保留它--keep-newer-files
:
--保留较新的文件
不要替换比其存档副本更新的现有文件。
tar
档案最初用于在磁带上方便地存储文件。从长期存储的角度来看,tar
存档可以代表一组文件在特定时间点的状态。从逻辑上讲,这应该包括该存档内容的时间戳。修改时间戳是文件内容修改时间的可靠衡量标准,而不是 atime(如果您读取文件,它会发生变化)或 ctime(当 tar “修复”提取文件上的任何元数据时,它可能会发生变化)。由于修改时间存在于存档内部,因此您还可以使用
-d
/--diff
选项将该信息与现有文件系统上的文件进行比较:
( ), or操作将指定的存档成员与同名的文件进行比较,然后报告文件大小、模式、所有者、修改日期和内容的差异
--compare
。-d
--diff
最后,如果您确实需要在提取存档时忽略修改时间戳,则-m
/--touch
选项可以做到这一点:
-m
,--touch
不提取数据修改时间。使用此选项时,tar 会将其提取的文件的数据修改时间保留为提取文件的时间,而不是将其设置为存档中记录的时间。
答案2
使用 GNU,tar
您可以提取存档的内容并将修改时间设置为当前日期/时间。
tar --touch -xvf source.tar.gz
这应该能让你实现你所寻求的。
默认行为是默认行为。我总是希望将mtime
文件的 被设置为其上次更新的实例,无论它来自哪个服务器,也无论包含文件系统是在哪里创建的。实用程序rsync
(部分)依赖于比较服务器和文件系统之间的时间戳的能力。