硬链接作为 cp 和 rsync 的目标

硬链接作为 cp 和 rsync 的目标

当目标路径与另一个路径共享 inode 时,在哪里可以找到有关命令cp和行为的文档?rsync换句话说,当我这样做时

$ cp [options] src dest
$ rsync [options] src dest 

当存在dest2与 相同 inode 的硬链接时dest,这些命令是否修改此 inode 处的内容 [让我们称之为行为 (i)],或者它们是否创建一个新的 inode,用 src 的内容填充此 inode ,并将 dest 链接到新的 inode [行为 (ii)]?

在行为 (i) 的情况下,我将通过访问看到cp和的结果,而在行为 (ii) 的情况下我不会看到它们。rsyncdest2

我观察到行为取决于选项。特别是,根据我的实验,通过-a选项,cp和都采取行为 (ii)。 rsync[cp没有任何选项采取行为(i)。]我想知道这是否得到保证,我希望有人指出文档。或者,如果有人能建议一些要搜索的单词或短语,我将不胜感激。

下面是我的实验。首先,我创建一个测试样本:

$ ls 
work
$ ls -li work/
total 12
23227072 -rw-rw-r-- 1 norio norio 17 Oct 19 00:52 file000.txt
23227071 -rw-rw-r-- 1 norio norio 17 Oct 19 00:52 file001.txt
23227073 -rw-rw-r-- 1 norio norio 17 Oct 19 00:52 file002.txt
$ cat work/file000.txt 
This is file000.
$ cat work/file001.txt 
This is file001.
$ cat work/file002.txt 
This is file002.
$ cp -r work backup
$ ls
backup  work
$ ls -li backup/
total 12
23227087 -rw-rw-r-- 1 norio norio 17 Oct 19 00:53 file000.txt
23227065 -rw-rw-r-- 1 norio norio 17 Oct 19 00:53 file001.txt
23227092 -rw-rw-r-- 1 norio norio 17 Oct 19 00:53 file002.txt
$ cat backup/file000.txt 
This is file000.
$ cat backup/file001.txt 
This is file001.
$ cat backup/file002.txt 
This is file002.
$ 
$ cp -al backup backupOld
$ ls
backup  backupOld  work
$ ls -li backupOld/
total 12
23227087 -rw-rw-r-- 2 norio norio 17 Oct 19 00:53 file000.txt
23227065 -rw-rw-r-- 2 norio norio 17 Oct 19 00:53 file001.txt
23227092 -rw-rw-r-- 2 norio norio 17 Oct 19 00:53 file002.txt
$ cat backupOld/file000.txt 
This is file000.
$ cat backupOld/file001.txt 
This is file001.
$ cat backupOld/file002.txt 
This is file002.
$ 

到目前为止,我在 下创建了文件backupOld作为到 下同名文件的硬链接backup。现在,我修改下面的文件work并将它们复制到backupby cpcp -a、 和rsync -a

$ echo "Hello work 000." >> work/file000.txt 
$ echo "Hello work 001." >> work/file001.txt 
$ echo "Hello work 002." >> work/file002.txt 
$ cat work/file000.txt 
This is file000.
Hello work 000.
$ cat work/file001.txt 
This is file001.
Hello work 001.
$ cat work/file002.txt 
This is file002.
Hello work 002.
$ 
$ cat backup/file000.txt 
This is file000.
$ cat backup/file001.txt 
This is file001.
$ cat backup/file002.txt 
This is file002.
$ cat backupOld/file000.txt 
This is file000.
$ cat backupOld/file001.txt 
This is file001.
$ cat backupOld/file002.txt 
This is file002.
$ 
$ ls -li work/
total 12
23227072 -rw-rw-r-- 1 norio norio 33 Oct 19 00:57 file000.txt
23227071 -rw-rw-r-- 1 norio norio 33 Oct 19 00:57 file001.txt
23227073 -rw-rw-r-- 1 norio norio 33 Oct 19 00:57 file002.txt
$ ls -li backup/
total 12
23227087 -rw-rw-r-- 2 norio norio 17 Oct 19 00:53 file000.txt
23227065 -rw-rw-r-- 2 norio norio 17 Oct 19 00:53 file001.txt
23227092 -rw-rw-r-- 2 norio norio 17 Oct 19 00:53 file002.txt
$ ls -li backupOld/
total 12
23227087 -rw-rw-r-- 2 norio norio 17 Oct 19 00:53 file000.txt
23227065 -rw-rw-r-- 2 norio norio 17 Oct 19 00:53 file001.txt
23227092 -rw-rw-r-- 2 norio norio 17 Oct 19 00:53 file002.txt
$ 
$ cp work/file000.txt  backup
$ cp -a work/file001.txt  backup
$ rsync -a work/file002.txt  backup
$ 
$ ls -li backup
total 12
23227087 -rw-rw-r-- 2 norio norio 33 Oct 19 01:00 file000.txt
23227094 -rw-rw-r-- 1 norio norio 33 Oct 19 00:57 file001.txt
23227095 -rw-rw-r-- 1 norio norio 33 Oct 19 00:57 file002.txt
$ 
$ ls -li backupOld
total 12
23227087 -rw-rw-r-- 2 norio norio 33 Oct 19 01:00 file000.txt
23227065 -rw-rw-r-- 1 norio norio 17 Oct 19 00:53 file001.txt
23227092 -rw-rw-r-- 1 norio norio 17 Oct 19 00:53 file002.txt
$ 

cp覆盖和23227087共享的inode 内容,而和分别为和创建新的 inode ,以保存从和复制的新内容。backup/file000.txtbackupOld/file000.txtcp -arsync -abackup/file001.txtbackup/file002.txtwork/file001.txtwork/file002.txt

$ cat backup/file000.txt 
This is file000.
Hello work 000.
$ cat backup/file001.txt 
This is file001.
Hello work 001.
$ cat backup/file002.txt 
This is file002.
Hello work 002.
$ cat backupOld/file000.txt 
This is file000.
Hello work 000.
$ cat backupOld/file001.txt 
This is file001.
$ cat backupOld/file002.txt 
This is file002.
$ 

答案1

cp的行为是由 POSIX 指定-aPOSIX 没有指定,但它暗示-R了它。复制单个文件时,不带-R,并且目标存在,

文件描述符目标文件应通过执行相当于的操作来获得打开()POSIX.1-2017 系统接口卷中定义的函数调用使用目标文件作为小路参数,以及 O_WRONLY 和 O_TRUNC 的按位或运算作为奥弗拉格争论。

因此,目标被打开、截断,并且其内容被源的内容替换; inode 不会改变,并且任何硬链接文件都会受到影响。

-R

目标文件应使用与以下内容相同的文件类型创建源文件

创建一个新文件。

rsync的行为记录在--inplace选项的描述中(请参阅man rsync):

此选项更改 rsync 在需要更新文件数据时传输文件的方式:rsync 不是创建文件的新副本并在完成后将其移动到位的默认方法,而是将更新的数据直接写入目标文件。

因此,默认情况下,rsync创建新文件而不是更新现有文件。

相关内容