답변:
기본적 tar
으로 하드 링크가있는 파일을 아카이브하도록 지시하고 아카이브 할 파일에 둘 이상의 링크가 포함 된 경우 파일은 한 번만 아카이브되고 두 번째 (및 추가 이름)는 하드 링크로 기록됩니다. 즉, 해당 아카이브를 추출하면 하드 링크가 복원됩니다.
이 --hard-dereference
옵션 을 사용하면 하드 링크가 유지 tar
되지 않습니다 . 대신, 내용과 메타 데이터가 동일한 독립 파일로 취급합니다. 아카이브를 추출하면 파일이 독립적입니다.
참고 : 먼저 파일의 링크 수를 확인하여 하드 링크를 인식합니다. 링크가 둘 이상인 각 파일의 장치 번호와 inode를 기록하고이를 사용하여 동일한 파일이 다시 아카이브되는시기를 감지합니다. (을 사용할 때는 --hard-dereference
이 작업을 수행하지 않습니다.)
하드 링크가있는 파일과 "링크 수"가있는 하드 링크되지 않은 파일을 구별 할 수 있습니다. 커맨드 라인에서 이것을 얻는 두 가지 방법이 있습니다.
% 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
"베드로"이전의 외로운 '2'가 링크 카운트입니다. 두 파일 이름의 아이 노드 번호는 932815입니다.
이 두 명령 모두 stat()
시스템 호출 에 의해 채워지는 struct stat의 st_nlink 필드에서 링크 수를 얻습니다 .
내가 알 수 있듯이 실행 tar
은 --hard-dereference
두 개의 별개의 파일 이름을 가진 단일 파일을 얻는 대신 (위의 예와 같이) 각각 하나의 파일 이름을 가진 두 개의 파일을 얻는다는 것을 의미합니다. tar
아마도 각 파일의 링크 수를 확인하고 기본적으로 압축을 풀 때 하드 링크 된 파일 데이터에 대한 두 번째 파일 이름에 하드 링크를 만듭니다. 호출 할 때 --hard-dereference
아카이브를 만드는, 두 번째 파일 이름의 추출 호출에 대한 완전히 새로운 파일을 만들 나타납니다 tar
실행됩니다.