使用linux命令修改创建的文件时间和日期的不同方法?

使用linux命令修改创建的文件时间和日期的不同方法?

这是我使用 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 存档。  选项包括paxziptmp.txtcpioo输出(这意味着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 -it读取存档并提取文件; -m恢复氧化时间; -u方法nconditional(没有此选项, cpio不会用旧文件覆盖新文件);和往常一样,-v意味着verbose(显示文件名)。)

笔记:

  • 您可以使用诸如 之类的命令获取人类可读日期的 Unix 日期(秒数等等)date -d "Jan 1, 2001" +%s。使用dc我之前展示的(桌面计算器)技巧将其转换为十六进制。
  • cpio 归档格式包含空字节。当前版本的vi( vim) 似乎尊重这些(即容忍它们并让它们独立)。其他编辑器,包括旧版本的vi,可能会损坏此类文件(通过删除空值),甚至拒绝编辑它们。
  • vi检测到 cpio 存档以换行符以外的字符结尾(“[不完整的最后一行]”)。当它保存文件时,它会添加一个换行符。其他存档程序(除了cpio)可能会将此检测为篡改,并可能拒绝接受修改后的存档。
  • 其他存档格式可能以二进制形式存储元数据(例如修改日期/时间)和/或具有校验和。编辑此类文件可能比我在这里描述的更困难。

相关内容