![하드 링크 역참조](https://rvso.com/image/23933/%ED%95%98%EB%93%9C%20%EB%A7%81%ED%81%AC%20%EC%97%AD%EC%B0%B8%EC%A1%B0.png)
명령 매뉴얼 페이지에는 tar
다음 하드 링크에 대한 옵션이 나열되어 있습니다.
-h, --dereference
follow symlinks; archive and dump the files they point to
--hard-dereference
follow hard links; archive and dump the files they refer to
tar
파일이 하드 링크인지 어떻게 알 수 있나요 ? 어떻게 합니까?따르다그것?
이 옵션을 선택하지 않으면 어떻게 되나요? 어떻게 합니까?~ 아니다하드 역참조?
답변1
기본적으로 tar
하드 링크가 있는 파일을 보관하도록 지시하고 보관할 파일에 해당 링크가 두 개 이상 포함되어 있으면 파일을 한 번만 보관하고 두 번째 파일(및 추가 이름)을 하드 링크로 기록합니다. 이는 해당 아카이브를 추출하면 하드 링크가 복원된다는 의미입니다.
--hard-dereference
옵션 을 사용 tar
하면~ 아니다하드 링크를 보존합니다. 대신, 동일한 내용과 메타데이터를 갖는 독립적인 파일로 처리합니다. 아카이브를 추출하면 파일은 독립적이 됩니다.
참고: 먼저 파일의 링크 수를 확인하여 하드 링크를 인식합니다. 두 개 이상의 링크가 있는 각 파일의 장치 번호와 inode를 기록하고 이를 사용하여 동일한 파일이 다시 아카이브되는 시기를 감지합니다. (를 사용하면 --hard-dereference
이 작업이 수행되지 않습니다.)
답변2
"링크 수"를 통해 하드 링크가 있는 파일과 하드 링크되지 않은 파일을 구별할 수 있습니다. 명령줄에서 이를 가져오는 두 가지 방법이 있습니다.
% stat original
File: ‘original’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 804h/2052d Inode: 932815 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 500/ bediger) Gid: ( 1000/ bediger)
Access: 2012-07-13 22:13:52.317101530 -0600
Modify: 2012-07-13 22:13:52.317101530 -0600
Change: 2012-07-13 22:14:08.050894536 -0600
Birth: -
또는
1010 % ls -li
total 0
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 original
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 secondary
"bediger" 앞의 외로운 '2'는 링크 수입니다. 두 파일 이름의 inode 번호는 모두 932815로 동일합니다.
나는 이 두 명령 모두 시스템 호출에 의해 채워지는 struct stat의 st_nlink 필드에서 링크 수를 얻는다고 확신합니다 stat()
.
내가 알 수 있는 한, tar
with를 실행한다는 --hard-dereference
것은 두 개의 서로 다른 파일 이름을 가진 단일 파일을 얻는 대신(위의 예에서처럼) 각각 단일 파일 이름을 가진 두 개의 파일을 얻는다는 것을 의미합니다. tar
아마도 각 파일의 링크 수를 확인하고 기본적으로 추출할 때 하드 링크된 파일 데이터에 대해 두 번째 파일 이름에 하드 링크를 생성합니다. 아카이브 생성 시 호출하면 --hard-dereference
추출 호출이 tar
실행될 때 두 번째 파일 이름에 대해 완전히 새로운 파일을 생성하는 것처럼 보입니다.