我正在将 Asterisk 通话录音从我们的主服务器复制到 samba 共享,并且创建日期和时间已更改为当前日期和时间。
文件格式为:in-xxxxxxxxxx-xxxxxxxxxx-20211020-162749-1634761669.7921917.wav
粗体部分在 EPOCH 时间。我有数百个这样的文件,我需要根据文件名中的 EPOCH 时间戳更改文件的创建日期。谁能帮我?
我正在将 Asterisk 通话录音从我们的主服务器复制到 samba 共享,并且创建日期和时间已更改为当前日期和时间。
文件格式为:in-xxxxxxxxxx-xxxxxxxxxx-20211020-162749-1634761669.7921917.wav
粗体部分在 EPOCH 时间。我有数百个这样的文件,我需要根据文件名中的 EPOCH 时间戳更改文件的创建日期。谁能帮我?
使用 GNU
touch
,您可以使用touch -d @1634761669.7921917 file
将文件的最后修改时间设置为指定的纪元时间(即使此处的精度为亚秒级)。所以你可以这样做
zsh
:如果它真的是创建时间,通常称为出生时间
ls -l --time=birth
,例如您想要更改的最新版本的 GNU报告ls
,AFAIK 在 Linux 上是不可能的,除了将时钟更改回那个时间并再次创建文件。如果在 Linux(最新版本¹)上,您只能更改新
time
命名空间中的时钟,以免影响全局系统时钟。例如,使用:
您将创建一个出生时间接近的
file.new
副本file
@1634761669.7921917
zsh
然后可以编写上面的脚本:(并且需要作为 运行
root
)。重新审视这一点时,有些想法:
我刚刚意识到这会导致一个潜在的问题:该
unshare --time
hack 允许将出生时间设置为过去的某个任意时间,但这也会导致更改状态时间(ls -lc
例如报告的时间)设置为过去,指定的时间,加上制作副本所用的时间)。该ctime也不意味着可以任意设置。通过这样设置它,它可能会打破某些软件可能对这些文件做出的假设。例如,备份软件可能决定忽略它,因为它的 ctime 早于上次备份时间。
因此,最好确保 ctime 没有在该命名空间中设置伪造的时钟时间,例如,仅在过去创建文件,但在当前复制其内容:
¹您需要 Linux 内核 5.6 或更高版本,并
CONFIG_TIME_NS
在内核和util-linux
2.36 或更高版本中启用。使用 time 命名空间 with
unshare
是不正确的。使用该date
命令设置系统日期和时间时,会进行“CLOCK_REALTIME”类型的系统调用。此系统调用与时间命名空间不兼容,因此,即使使用时间命名空间 (
unshare -T
) 的目的是不影响整个操作系统,它也不起作用。当使用带有 -T/--time 选项的 unshare 时,唯一会在新命名空间中生效的系统调用是 CLOCK_MONOTONIC/BOOTTIME(示例uptime
命令)。要克隆访问和修改时间,可以使用 touch 的 -r 选项。