这是我使用 linux 命令创建的文件。
touch tmp.txt
现在我尝试替换它的日期和时间,所以我所做的如下:
ls -l tmp.txt
-rwrx-rx-x 1 yush guest 600 jul 10 16:58 tmp.txt
我使用以下命令来替换上述创建的文件的年份?
touch -d "1 year ago" tmp.txt
现在,
ls -l tmp.txt
-rwxr-xr-x 1 yush guest 600 jul 10 2016 tmp.txt
我的疑问是否还有其他命令可以使用 linux 执行上述操作?
答案1
明确设置访问和修改时间:
# touch -t [[CC]YY]MMDDhhmm[.SS]
例如
# touch -t 201212101830.55 tmp.txt
# touch -d "2012-10-19 12:12:12.000000000 +0530" tmp.txt
# touch -d "2017-10-19 14:59:12" tmp.txt
您可以使用另一个文件的时间戳:
# touch -r file1.txt file2.txt
答案2
您可以使用归档程序来执行此操作(尽管并不干净或容易)。请注意,实际文件(在文件系统中)的元数据(权限模式、所有者、组、修改日期/时间等)存储在 inode(即“系统数据”)中,但文件的元数据已归档文件作为用户数据存储在存档文件中。这些通常可以被操纵,但有不同程度的难度。
我将举一个例子cpio
;使用其他归档程序(例如ar
,、、、、家庭等)可能可以实现类似的效果。首先,使用已知的修改日期/时间创建文件(为了重现性)tar
;然后创建一个仅包含该文件的 cpio 存档。 选项包括pax
zip
tmp.txt
cpio
o
哦输出(这意味着cpio
将写入存档)并c
使用便携式(C兼容)格式,这可能更容易操作。
$ touch -d "7/12/2017 00:00" tmp.txt $ ls -l tmp.txt -rw-r--r-- 1我的用户名 我的组名 0 七月 12 00:00 tmp.txt $ 回显 tmp.txt | cpio -oc > tmp.cpio 1块
检查存档。
cpio -itv
表示读取档案(我输入)并产生一个v埃尔博斯t能够的内容。
$ cpio -itv < tmp.cpio -rw-r--r-- 1我的用户名 我的组名 0 七月 12 00:00 tmp.txt 1块 $ 猫 tmp.cpio 070701000595CC000081A4000303E900030201000000015965668000000000000068E70000C36100 000000000000000000000800000000tmp.txt0707010000000000000000000000000000000000000 0010000000000000000000000000000000000000000000000000000000B00000000拖车!!!
我通过逆向工程发现(它可能记录在某处;我没有检查)存档中第一个文件的修改日期/时间存储为 Unix 时间(表示秒数的 32 位整数)自 1970 年 1 月 1 日 00:00 GMT 起),格式为字符位置 47-54 处的八位十六进制数字。我在上面突出显示了值59656680
。一旦您知道它是一个格式化为八位十六进制数字的 Unix 时间,就不难找到它。您可以获得当前的使用命令 Unix 时间(十进制)date +%s
,你可以通过说得到它的十六进制
(date +%s; echo "16op") | dc
现在,修改元数据!使用您选择的编辑器编辑存档:
$ vi tmp.cpio 0707010005807C000081A4000303E900030201000000015965668000000000000068E70000C36100 000000000000000000000800000000tmp.txt^@^@^@0707010000000000000000000000000000000 0000000010000000000000000000000000000000000000000000000000000000B00000000拖车 !!!^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@ ~ ~ ~ ~ ~ "tmp.cpio" [最后一行不完整] 1 行,512 个字符
弄清楚你想把它改成什么。在你的问题中,你提到将时钟拨回一年。那么,正常的一年 365 天的秒数是 365×24×60×60 = 31536000(十进制)= 1E13380(十六进制)。所以减去 59656680−1E13380;结果是57843300。并在文件中更改它:
0707010005807C000081A4000303E900030201000000015784330000000000000068E70000C36100 000000000000000000000800000000tmp.txt^@^@^@0707010000000000000000000000000000000 0000000010000000000000000000000000000000000000000000000000000000B00000000拖车 !!!^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@ ~ ~ ~ ~ ~ "tmp.cpio" [最后一行不完整] 1 行,512 个字符
保存并退出。检查您的更改:
$ 猫 tmp.cpio 070701000595CC000081A4000303E900030201000000015784330000000000000068E70000C36100 000000000000000000000800000000tmp.txt0707010000000000000000000000000000000000000 0010000000000000000000000000000000000000000000000000000000B00000000拖车!!! $ cpio -itv < tmp.cpio -rw-r--r-- 1我的用户名 我的组名 2012 年 7 月 0 日 2016年tmp.txt 1块 $ cpio -imuv < tmp.cpio tmp.txt 1块 $ ls -l tmp.txt -rw-r--r-- 1我的用户名 我的组名 2012 年 7 月 0 日 2016年tmp.txt
你瞧:您已经更改了文件的修改日期/时间。 (cpio -i
不t
读取存档并提取文件;
-m
恢复米氧化时间;
-u
方法你nconditional(没有此选项,
cpio
不会用旧文件覆盖新文件);和往常一样,-v
意味着verbose(显示文件名)。)
笔记:
- 您可以使用诸如 之类的命令获取人类可读日期的 Unix 日期(秒数等等)
date -d "Jan 1, 2001" +%s
。使用dc
我之前展示的(桌面计算器)技巧将其转换为十六进制。 - cpio 归档格式包含空字节。当前版本的
vi
(vim
) 似乎尊重这些(即容忍它们并让它们独立)。其他编辑器,包括旧版本的vi
,可能会损坏此类文件(通过删除空值),甚至拒绝编辑它们。 vi
检测到 cpio 存档以换行符以外的字符结尾(“[不完整的最后一行]”)。当它保存文件时,它会添加一个换行符。其他存档程序(除了cpio
)可能会将此检测为篡改,并可能拒绝接受修改后的存档。- 其他存档格式可能以二进制形式存储元数据(例如修改日期/时间)和/或具有校验和。编辑此类文件可能比我在这里描述的更困难。