与此问题相关
问题的简短描述:
当源树内部有安装点时,即使使用-a
选项,也不会保留复制到目标树时该安装点内文件的时间戳
详细说明:
假设这是源树:
/home/ /home/
| |
me/ BACKUP/
| |
+----+----------+ +----+-------+
| | | | | |
data/ foo.txt boo.txt data/ foo.txt boo.txt
| |
a.txt a.txt
Run Code Online (Sandbox Code Playgroud)
其中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
Run Code Online (Sandbox Code Playgroud)
h3r*_*ler 56
来自man rsync
:
Run Code Online (Sandbox Code Playgroud)-t, --times preserve modification times
编辑 - 改进这个答案,因为为什么这对 OP 没有帮助并不是很明显:
OP 正在将文件从一个文件系统复制到另一个文件系统并希望保留c-time
. 大多数人理解c-time
的意思是“创建时间”,这在大多数 UNIX/Linux 系统上是不正确的(Windows 文件系统跟踪“创建”或“诞生”时间)。
在大多数情况下,在UNIX和Linux,c-time
是用来记录的最后一个索引节点“时间戳Ç ”焊割。如果更新了 inode 的任何属性,则会更改 inode:
c-time
当他们被带到一个新的文件系统时,OP 无法保留他们的文件。在新文件系统中创建这些文件是上面列出的条件之一(创建 inode/file)。
/编辑
小智 9
正如 hr3miller 已经说过的,-a(或 --archive)等于 -rlptgoD 并且已经包括同步时间。
但是,当 rsync 将数据复制到,例如。保存用户和所有者失败的 NFS/FAT32/NTFS 挂载,rsync 不会尝试设置时间。Rsync 会发出类似警告
rsync: chown "/mnt/backup/postgres/hourly.0/primary/var" failed: Operation not permitted (1)
Run Code Online (Sandbox Code Playgroud)
因此,通过使用省去保留用户和组
-rlptD
Run Code Online (Sandbox Code Playgroud)
代替
-rlptgoD
Run Code Online (Sandbox Code Playgroud)
仅当不保留所有者和组是您的选择时才使用此选项。请注意,保留符号链接和其他功能也可能触发该行为。您必须查看要备份的每个 rsync 功能 (-r -l -p -t -g -o -D) 的手册页。