cpとrsyncのターゲットであるハードリンク

cpとrsyncのターゲットであるハードリンク

ターゲットパスが他のパスとinodeを共有している場合、cpコマンドとアクションに関するドキュメントはどこにありますか?rsyncつまり、私がするとき

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

dest2同じinodeへのハードリンクがある場合、destこれらのコマンドはこのinodeの内容を変更しますか(動作(i)と呼びます)。それとも新しいinodeを作成し、このinodeをsrcの内容で埋めて置き換えますか?新しい 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。次に、以下のファイルを変更してby、、、workにコピーします。backupcpcp -arsync -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
$ 

cpinodeの内容を上書きして23227087共有しますが、 と と からコピーした新しい内容を保持するために、それぞれと の新しい 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のビットごとのOR演算は次のとおりです。超過分議論。

したがって、ターゲットが開かれ、切り捨てられ、その内容がソースの内容に置き換えられ、ハードリンクされたファイルは影響を受けません。

そして-R

これ宛先ファイルと同じファイル形式を使用して生成する必要があります。ソースファイル

新しいファイルを作成します。

rsyncの動作は--inplaceオプションの説明に文書化されています(参照:man rsync):

このオプションは、ファイルデータを更新する必要があるときにrsyncがファイルを転送する方法を変更します。ファイルの新しいコピーを作成して完了したら、その場所に移動するデフォルトの方法ではなく、rsyncは更新されたデータをターゲットファイルに直接書き込みます。

したがって、既定では、rsync既存のファイルを更新するのではなく、新しいファイルが作成されます。

おすすめ記事