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