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기존 파일을 업데이트하는 대신 새 파일이 생성됩니다.

관련 정보