我有多个 .tgz 内核崩溃日志,必须从一个文件中提取。这些 .tgz 文件的时间戳很重要。每当我使用以下内容时:
tar - zvxf paniclogs.tgz
-rwxrwxrwx 1 root root 22359 Feb 22 15:03 kernel-panic-20190213020406-3.tgz
-rwxrwxrwx 1 root root 22971 Feb 22 15:03 kernel-panic-20190213020844-2.tgz
-rwxrwxrwx 1 root root 28344 Feb 22 15:03 kernel-panic-20190213101549-1.tgz
-rwxrwxrwx 1 root root 30683 Feb 22 15:03 kernel-panic-20190213154050-0.tgz
它提取日志,但将时间戳更改为我提取日志时的日期和时间。当我使用 Cygwin 时情况并非如此。我知道一定有一种方法可以提取这些日志并保留时间戳。你能帮忙吗?谢谢。
答案1
这无法做到使用 GNU tar。但是,有一个鲜为人知的实用程序star
,由 Jörg Schilling 开发,它可以完成您想要的任务。我将演示它的工作原理。
首先,我们可以检查测试 tgz 存档中的单个文件并显示其时间戳,我已在下面突出显示以使终端输出完全清晰:
andrew@ilium$ tar -tv --full-time -f test.tgz mp3enc31/readme.txt
-rw-r--r-- sir/inel 937 1998-11-06 00:28:41 mp3enc31/readme.txt
^^^^^^^^^^
正如您所发现的,当您以常规方式提取此文件时,tar
访问时间(和更改时间)会发生变化。我再次更改了终端输出以轻松显示这一点:
andrew@ilium~$ tar -xf test.tgz mp3enc31/readme.txt
andrew@ilium~$ stat mp3enc31/readme.txt
File: readme.txt
Size: 937 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 56885505 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ andrew) Gid: ( 100/ users)
Access: 2019-02-23 17:13:55.385500219 +1100 <--------------------
Modify: 1998-11-06 00:28:41.000000000 +1100
Change: 2019-02-23 17:13:55.385500219 +1100 <--------------------
Birth: -
andrew@ilium~$
但是如果我们使用该star
实用程序sudo
,(请注意 sudo 是必需的对于 ctime 修改)你会看到全部访问时间被保留:
andrew@ilium~$ sudo star -xza -ctime < test.tgz mp3enc31/readme.txt
star: 62 blocks + 0 bytes (total of 634880 bytes = 620.00k).
andrew@ilium~$ stat mp3enc31/readme.txt
File: readme.txt
Size: 937 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 59377688 Links: 1
Access: (0644/-rw-r--r--) Uid: (30076/ UNKNOWN) Gid: (30000/ UNKNOWN)
Access: 1998-11-06 00:28:41.000000000 +1100 <--------------------
Modify: 1998-11-06 00:28:41.000000000 +1100
Change: 1998-11-06 00:28:41.000000000 +1100 <--------------------
Birth: -
andrew@ilium~$
手册star
页建议一些警告使用该-ctime
选项可能会使 cron、新闻系统混乱,甚至会降低系统时钟。所以要小心一点!
参考:
- star 的手册页:上述使用的所有选项的文档以及许多其他可用选项的演示。