압축을 풀 때 디렉터리 이름을 선택하는 방법

압축을 풀 때 디렉터리 이름을 선택하는 방법

압축을 풀면 디렉터리가 ugly_name.tar되는 이라는 파일이 있다고 가정해 보겠습니다 . ugly_name생성된 디렉터리 이름 대신 어떤 명령을 사용할 수 있습니까 pretty_name?

답변1

이것은 작동합니다:

mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1

-C압축을 풀기(또는 패키징하기) 전에 지정된 디렉터리로 변경하세요. --strip-components아카이브에 저장된 파일 이름에서 지정된 수의 디렉터리를 제거합니다.

이것은 실제로 이식 가능하지 않습니다. GNU tar와 최소한 일부 BSD tar에는 이 --strip-components옵션이 있지만 다른 UNIX 계열 플랫폼에는 존재하지 않는 것 같습니다.

그러나 이 어리석은 접근 방식은 거의 모든 곳에서 작동합니다.

tar xf ugly_name.tar && mv ugly_name pretty_name

답변2

그리고GNU 타르≥1.16, 사용--transform각 파일 이름에 sed regexp 변환을 적용합니다(변환은 아카이브의 전체 경로에 적용됩니다).

tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'

ugly_name아카이브에 있는 모든 파일 이름의 최상위 구성 요소인 경우 정확히 일치하는지 걱정할 필요가 없습니다 .

tar xf foo.tar --transform 's/ugly_name/pretty_name/'

최상위 디렉터리의 이름을 모르는 경우에도 이 방법을 사용할 수 있습니다.--strip-components대신에.

tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'

그리고paxPOSIX 아카이브 유틸리티인 은 -ssed와 유사한 대체 표현식을 인수로 사용하는 이 옵션을 사용합니다.

pax -rf foo.tar -s '!^ugly_name\($\|/\)!pretty_name\1!'
pax -rf foo.tar -s '/ugly_name/pretty_name/'
pax -rf foo.tar -s '!^[^/]\+\($\|/\)!pretty_name\1!'

답변3

가장 간단한 방법

tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1

답변4

편집하다

에서 지적한 바와 같이논평, 이 방법은 적절하게 구성된 아카이브에는 작동하지 않지만또 다른 대답--strip-components 1실제로 작동하려면 추가해야 합니다 . 이 새로운 옵션을 테스트해 본 결과 최상위 이름이 있는 아카이브와 최상위 이름이 없는 아카이브 모두에서 작동합니다.


원래 답변

AskUbuntu에서 이것은답변나를 위해 작동합니다:

tar zxvf ugly_name.tgz --one-top-level=pretty_name

`--one-top-level[=dir]'

tar에게 추출 디렉터리(또는 "-C"로 전달된 디렉터리) 아래에 새 디렉터리를 만들고 이를 사용하여 tarbomb로부터 보호하도록 지시합니다. dir 매개변수가 없으면 새 디렉토리의 이름은 아카이브의 기본 이름(인식되는 경우 파일 이름에서 아카이브 접미사를 뺀 이름)과 동일합니다. 디렉터리 이름으로 시작하지 않는 모든 멤버 이름("--transform" 및 "--strip-comComponents"에서 변환한 후)에는 해당 디렉터리 이름이 붙습니다. 인식되는 파일 이름 접미사는 ".tar"이며 See에서 인식하는 모든 압축 접미사는-자동 압축.

관련 정보