ターゲットパスが他のパスとinodeを共有している場合、cp
コマンドとアクションに関するドキュメントはどこにありますか?rsync
つまり、私がするとき
$ cp [options] src dest
$ rsync [options] src dest
dest2
同じinodeへのハードリンクがある場合、dest
これらのコマンドはこのinodeの内容を変更しますか(動作(i)と呼びます)。それとも新しいinodeを作成し、このinodeをsrcの内容で埋めて置き換えますか?新しい 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
。次に、以下のファイルを変更してby、、、work
にコピーします。backup
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
inodeの内容を上書きして23227087
共有しますが、 と と からコピーした新しい内容を保持するために、それぞれと の新しい 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のビットごとのOR演算は次のとおりです。超過分議論。
したがって、ターゲットが開かれ、切り捨てられ、その内容がソースの内容に置き換えられ、ハードリンクされたファイルは影響を受けません。
そして-R
、
これ宛先ファイルと同じファイル形式を使用して生成する必要があります。ソースファイル。
新しいファイルを作成します。
rsync
の動作は--inplace
オプションの説明に文書化されています(参照:man rsync
):
このオプションは、ファイルデータを更新する必要があるときにrsyncがファイルを転送する方法を変更します。ファイルの新しいコピーを作成して完了したら、その場所に移動するデフォルトの方法ではなく、rsyncは更新されたデータをターゲットファイルに直接書き込みます。
したがって、既定では、rsync
既存のファイルを更新するのではなく、新しいファイルが作成されます。