추출하려고 하는데보관소이러한 내부 구조를 가짐(간소화)
[edit: added toplevel dir]
some_tarball.tar
└── some_tarball/
├── bin/
│ ├── a
│ └── b
└── share/
└── man/
└── man1/
├── a.1.gz
└── b.1.gz
/bin
그것을 디렉토리 에 설치하기 위해 /share
나는 명령을 사용했습니다 sudo tar xzf some_tarball.tar --strip-components 1 -C /
.
그러나 이는 내용을 병합하는 대신 전체 디렉토리를 해당 내용(즉 /bin
, 포함 a
및 그 이후의 내용) 으로 덮어쓰게 됩니다 . b
내부에제어 무시부분적 tar manpage
으로는 기존 파일을 덮어쓰는 작업인 것 같습니다.메타데이터dirs, 그러나 그것은 사실이 아닙니다.
여기에서 tar
데모 와 유사한 동작을 얻을 수 있는 방법이 있습니까 rsync
? 미리 감사드립니다!
추신: 그게 중요하다면 내 /share
것은 심볼릭 링크입니다 /usr/share
.
답변1
처음에 심볼릭 링크 였다면 /bin
사용하는 명령은 심볼릭 링크를 제거하고 그 자리에 새 디렉터리를 만듭니다.
더 읽어보세요수동(강조):
아카이브에서 읽을 때
--dereference
(-h
) 옵션을 사용 하면tar
아카이브에서 지정된 파일을 쓰거나 읽을 때 기존 기호 링크를 따르게 됩니다.tar
일반적으로tar
이러한 링크는 클릭되지 않지만 새 파일을 작성하기 전에 링크가 제거될 수 있습니다.. […]이
--dereference
옵션은 안전하지 않습니다 [...]
하나 참고디렉토리도 파일이다.
당신은 아마도 무슨 일이 일어났는지 링크를 사용하거나 제거하지 않았습니다 --dereference
.-h
링크가 가리키는 디렉토리는 여전히어딘가에, 해당 콘텐츠는 삭제되지 않았습니다. 하지만 도구가 /bin
매우 중요하기 때문에 운영 체제가 무릎을 꿇을 수도 있습니다. 이 문제를 해결하려면 원래 링크를 다시 만들어야 합니다. 새 /bin
디렉터리를 삭제하고 ln -s target /bin
.
target
안타깝게도 링크의 대상이 무엇인지 알 수 없습니다. 링크의 대상이 무엇인지 추측하거나 알아내야 합니다 .아마도 /usr/bin
.
비슷하다 /share
.
여전히 로그인되어 있거나 다시 로그인할 수 있는 경우 필요한 모든 도구가 어딘가에 있어야 하므로 기술적으로 수정이 가능해야 합니다. 액세스 권한을 잃은 경우(예: /bin/bash
로그인 셸이 존재하지 않아 로그인할 수 없는 경우) 라이브 배포를 시작하고 거기에서 복구할 수 있는 옵션이 있습니다.