기존 파일을 덮어쓰지 않고 대상 디렉토리에 tarball 추출

기존 파일을 덮어쓰지 않고 대상 디렉토리에 tarball 추출

추출하려고 하는데보관소이러한 내부 구조를 가짐(간소화)

[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로그인 셸이 존재하지 않아 로그인할 수 없는 경우) 라이브 배포를 시작하고 거기에서 복구할 수 있는 옵션이 있습니다.

관련 정보