与此相关问题
问题的简短描述:
当源树内部有安装点时,即使使用-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 也会发生变化:
- 创作(OP的案例)
- 模式(权限)
- 所有者/组
- 硬链接计数
- 等等(stat()系统调用)
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
并且确信它可以保留我的修改时间。我现在仔细检查了一下。