当源树具有安装点时,如何告诉 rsync 在文件上保留时间戳

当源树具有安装点时,如何告诉 rsync 在文件上保留时间戳

与此相关问题

问题的简短描述:

当源树内部有安装点时,即使使用-a选项,复制到目标树时该安装点内部文件的时间戳也不会保留

详细说明:

假设这是源树:

                       /home/                           /home/
                         |                                |
                        me/                             BACKUP/
                         |                                |
                    +----+----------+                +----+-------+
                    |    |          |                |    |       |
                 data/  foo.txt    boo.txt         data/ foo.txt boo.txt
                    |                                |
                   a.txt                           a.txt

data/上面是挂载外部USB盘的地方。一切都是ext4文件系统。源中的所有内容都属于我的me

BACKUP也恰好是一个挂载点,备份U盘。

发出此命令后rsync -av --delete /home/me/ /home/BACKUP/,我发现/home/BACKUP/data/它下面的所有内容都有当前时间戳,就好像这些文件是现在创建的,而不是/home/me/data/.外部的其他文件和文件夹data确实保留了时间戳。

问题是:如何rsync在上述设置中使用来告诉它保留所有文件和文件夹的时间戳,甚至在安装点上的文件和文件夹上?

我在用:

>uname -a
Linux 3.5.0-17-generic #28-Ubuntu SMP x86_64 x86_64 x86_64 GNU/Linux

>rsync -v
rsync  version 3.0.9  protocol version 30

答案1

man rsync

   -t, --times                 preserve modification times

由于您要将文件从一个文件系统复制到另一个文件系统并希望保留c-time.大多数人理解c-time“创建时间”,这在大多数 UNIX/Linux 系统上是不正确的(Windows 文件系统跟踪“创建”或“诞生”时间)。

在大多数情况下,在 UNIX 和 Linux 中,c-time时间戳是用于记录最后一个 inode 'C'hange。如果更新了 inode 的任何属性,则该 inode 也会发生变化:

c-time当他们的文件被带入新的文件系统时,OP 无法保留它们的文件。在新文件系统中创建这些文件是上面列出的条件之一(创建 inode/文件)。

答案2

正如 hr3miller 已经说过的,-a(或 --archive)等于 -rlptgoD 并且已经包括同步时间。

但是,当 rsync 将数据复制到例如时。当 NFS/FAT32/NTFS 挂载保留用户和所有者失败时,rsync 不会尝试设置时间。 Rsync 会发出类似警告

rsync: chown "/mnt/backup/postgres/hourly.0/primary/var" failed: Operation not permitted (1)

因此,通过使用保留用户和组

-rlptD

代替

-rlptgoD

仅当您可以选择不保留所有者和组时才使用此选项。请注意,保留符号链接和其他功能也可能会触发该行为。您必须仔细阅读要备份的每个 rsync 功能 (-r -l -p -t -g -o -D) 的手册页。

答案3

您可以使用该touch工具来实现此目的。该-r参数会将时间戳从一个文件/文件夹复制到另一个文件/文件夹。

cd srcParentDir
find srcDir -exec touch -r {} /target/dir/{} \;

或者举个例子:

cd /home/me
find . -exec touch -r {} /home/BACKUP/{} \;

它将执行以下语句:

touch -r ./data/a.txt /home/BACKUP/./data/a.txt
touch -r ./foo.txt /home/BACKUP/./foo.txt
touch -r ./boo.txt /home/BACKUP/./boo.txt

因此基本上将旧时间戳复制到新文件系统。

如果目标路径中有空格,则必须转义它们/home/my\ spaced\ path/。我认为{}会为你逃脱,尽管我不是 100% 确定。

答案4

我使用它rsync -az并且确信它可以保留我的修改时间。我现在仔细检查了一下。

相关内容