![硬链接作为 cp 和 rsync 的目标](https://linux22.com/image/225664/%E7%A1%AC%E9%93%BE%E6%8E%A5%E4%BD%9C%E4%B8%BA%20cp%20%E5%92%8C%20rsync%20%E7%9A%84%E7%9B%AE%E6%A0%87.png)
当目标路径与另一个路径共享 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) 的情况下我不会看到它们。rsync
dest2
我观察到行为取决于选项。特别是,根据我的实验,通过-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
并将它们复制到backup
by cp
、cp -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.txt
backupOld/file000.txt
cp -a
rsync -a
backup/file001.txt
backup/file002.txt
work/file001.txt
work/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 指定。-a
POSIX 没有指定,但它暗示-R
了它。复制单个文件时,不带-R
,并且目标存在,
文件描述符目标文件应通过执行相当于的操作来获得打开()POSIX.1-2017 系统接口卷中定义的函数调用使用目标文件作为小路参数,以及 O_WRONLY 和 O_TRUNC 的按位或运算作为奥弗拉格争论。
因此,目标被打开、截断,并且其内容被源的内容替换; inode 不会改变,并且任何硬链接文件都会受到影响。
和-R
,
这目标文件应使用与以下内容相同的文件类型创建源文件。
创建一个新文件。
rsync
的行为记录在--inplace
选项的描述中(请参阅man rsync
):
此选项更改 rsync 在需要更新文件数据时传输文件的方式:rsync 不是创建文件的新副本并在完成后将其移动到位的默认方法,而是将更新的数据直接写入目标文件。
因此,默认情况下,rsync
创建新文件而不是更新现有文件。