AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 669234
Accepted
leetbacoon
leetbacoon
Asked: 2021-09-16 20:56:13 +0800 CST2021-09-16 20:56:13 +0800 CST 2021-09-16 20:56:13 +0800 CST

备份和恢复文件/目录的时间戳?

  • 772

我们需要备份文件和目录的 a/c/mtime-stamps,并有能力在必要时恢复它们。

备份的示例命令可能是:

$ timestamp backup --all-stamps --incl-dir-stamps --recursive out.stampbak file.bin /dir/with/files/

恢复可能是:

$ timestamp restore --all-stamps out.stampbak

是否存在这样的命令来实现我正在寻找的结果?纳秒精度将是首选,或者其他更精细的精度,尽管我相信大多数文件系统停止在纳秒。POSIX 合规性也很重要,因为我们需要支持/恢复 BSD 和 GNU/Linux 系统上的时间戳。


编辑:为了澄清一些事情,我列出的文件系统在很大程度上是暂时保留文件,直到我最终可以将它们移动到主 ZFS 服务器。这就是让我们考虑在将数据迁移到 ZFS之前保留时间戳的可能性的原因。以防邮票在传输过程中发生变化(我们使用 HTTP、FTP、SMB 等多种方法),我们希望确保它们可以恢复到应有的状态。即使是在传输后,将时间戳保留为小备份也是有益的,因此无论文件最终会在 ZFS 上结束,问题仍然是仅支持/恢复时间戳。可以从备份中省略权限和组信息。

用于备份时间戳的操作系统包括 macOS Mojave 10.14.6、Ubuntu Server 18.04.5 LTS、Debian 10.2/7.8、FreeBSD 12.2 和 CentOS 8。恢复将主要在 FreeBSD(ZFS 服务器主机)上完成,我不认为在其他任何地方都没有必要。如果有帮助的话,我有几个驱动器,其中包含 NTFS 分区上的文件。是否有必要运行一个小型 Windows 实例来正确备份这些标记?

此外,我的印象是大多数文件系统使用 atime、ctime 和 mtime,而没有其他文件系统(我认为这最终在文件系统之间有所不同)。如果可能的话,我的目标是保存和恢复所有这些。

我提到了 POSIX 合规性,该工具可以在任一平台上使用——如果我之前的描述不正确或不充分,我深表歉意。我还认为 ctime = 创建/出生时间,我现在看到它是更改时间。

要保留的最重要的时间戳是创建/出生时间和修改时间。访问时间也会很好,更改时间是最不重要的,但仍然会有所帮助。再次,我为这个错误道歉,我还在学习。


编辑 2:从这篇文章中我了解到:

  • 大多数文件系统中没有保存文件创建时间戳——这意味着你不能运行诸如“显示在特定日期创建的所有文件”之类的命令。这就是说,通常可以从 ctime 和 mtime 推断出相同的内容(如果它们匹配 - 这可能意味着那是文件创建的时间)。

  • 创建新文件或目录时,通常将所有三个时间(atime、ctime 和 mtime)都配置为捕获当前时间。

由于目标文件系统将是 ZFS,文件/目录的时间戳将在其中恢复,因此最好至少保存 atime、ctime、mtime,以防保存时间戳的文件系统不存储出生时间。

backup posix
  • 3 3 个回答
  • 731 Views

3 个回答

  • Voted
  1. Best Answer
    ilkkachu
    2021-09-18T00:28:08+08:002021-09-18T00:28:08+08:00

    如果你有 GNU find 和 Perl,你可以用它们来装点东西。可以打印时间戳的-printf操作find,Perl 具有utime修改它们的功能。或者两个,内置一个,一个在 Time::HiRes 模块中,后者支持亚秒级精度。

    一些用于测试的文件:

    $ find . -printf '%A@ %T@ %p\n'
    1631866504.4180281370 1631866763.5380257720 .
    1631866763.5380257720 1631866768.2101700800 ./dir
    1631866768.2101700800 1631866768.2101700800 ./dir/bar.txt
    1631866760.2619245850 1631866760.2619245850 ./foo.txt
    

    将时间戳保存到文件中:

    $ find . -printf '%A@ %T@ %p\0' > ../times
    

    让我们删除时间戳:

    $ touch -d 1999-01-01 **/*
    $ find . -printf '%A@ %T@ %p\n'
    1631866771.6022748540 1631866763.5380257720 .
    915141600.0000000000 915141600.0000000000 ./dir
    915141600.0000000000 915141600.0000000000 ./dir/bar.txt
    915141600.0000000000 915141600.0000000000 ./foo.txt
    

    并从文件中重新加载它们:

    $ perl -MTime::HiRes=utime -0 -ne 'chomp; my ($atime, $mtime, $file) = split(/ /, $_, 3); utime $atime, $mtime, $file;'    < ../times
    1631866771.6022748950 1631866763.5380258560 .
    1631866771.6022748950 1631866768.2101700310 ./dir
    1631866768.2101700310 1631866768.2101700310 ./dir/bar.txt
    1631866760.2619245050 1631866760.2619245050 ./foo.txt
    

    该文件仅包含带有 atime、mtime 和文件名的以 NUL 结尾的字段,并且 Perl 片段调用utime每组值。

    使用 NUL 作为终止符,它应该能够处理任意文件名,但请注意,我在这里使用\n而不是\0用于打印输出,这不适用于该 Perl 代码段,因为它需要 NUL,而不是换行符。

    另外,我完全忽略了 ctime,因为据我所知,它无论如何都不能用utime()/设置。utimensat()任何出生时间戳都一样。

    • 3
  2. schily
    2021-09-18T10:51:57+08:002021-09-18T10:51:57+08:00

    如前所述,设置ctime和类似设置的唯一方法是从内核内部和用户界面界面,有充分的理由不允许设置超出atime和的时间戳mtime。如果您想保留ctimeand crtime,可以使用ZFS/sendand来完成ZFS/receive,但这需要双方都已经有 ZFS。

    所以让我重复一下我相信你喜欢做什么:

    • 将现有文件系统复制到另一个位置

    • 稍后通过不同的程序保留atime并mtime在执行此复制或恢复时间戳时。

    您可以通过运行任何备份/恢复方法,然后运行另一个恢复时间戳的程序或运行能够正确恢复时间戳的备份/恢复方法来做到这一点。

    star是一个成熟的备份工具,可以帮助您使用这两种方法。

    如果您喜欢用来star备份和恢复包括时间戳在内的文件系统,请查看手册页:http ://schilytools.sourceforge.net/man/man1/star.1.html

    如果您想分别保存和恢复时间戳,则需要在运行备份之前保存时间戳,因为备份很可能会影响atime所有文件的值。

    • 要保存目录树中所有文件的所有时间戳,只需运行:

      star -c -dump -meta f=timestamparchive.tar .
      
    • 要将所有时间戳恢复到新位置,请运行:

      star -xU -meta f=timestamparchive.tar
      

    第一个命令创建的存档文件使用大约。每个文件 1.5 KB。第二个命令将从存档中的所有文件中恢复所有时间戳,这些文件已经存在,但不会触及文件内容。

    BTW:我是 39 年以来的明星作者。

    • 1
  3. pell
    2021-09-17T13:16:12+08:002021-09-17T13:16:12+08:00

    “ls --full-time”命令为可以使用“awk”格式化并使用“date”保存到以当前时间命名的文件的文件提供完整的时间戳:

    ls --full-time | awk '{print $6"\t"$7"\t"$9}' > timestamps.output.`date +%Y-%m-%d_%k:%M:%S.%N`
    

    这会产生类似的东西:

    timestamps.output.2021-09-16_16:33:05.363928457:
    
    2021-09-16  16:13:40.988062443  file1
    2021-09-16  16:13:45.408053173  file2
    2021-09-16  16:13:49.496044596  file3
    2021-09-16  16:13:52.628038023  file4
    

    这将允许您跟踪文件时间戳随时间的变化。当然,您可以随意格式化时间戳。

    您还可以使用“git”存储库来跟踪 timestamp.output 文件随时间的变化。

    • -1

相关问题

  • 从什么时候开始 POSIX 和 GNU rm 不删除 /?

  • 如何在 POSIX shell 脚本中创建算术循环?

  • 处理最后一个命令的退出代码的正确方法是什么?

  • 我可以将时移快照保存到保管箱吗?

  • 当会话负责人退出时,unix 会话会发生什么?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve