it-swarm-ko.tech

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

압축을 풀면 ugly_name.tar 디렉토리가되는 ugly_name라는 파일이 있다고 가정 해보십시오. 결과 디렉토리 이름이 pretty_name가되도록 어떤 명령을 사용할 수 있습니까?

132
tshepang

이것은 작동해야합니다 :

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

-C는 포장 풀기 (또는 포장)하기 전에 지정된 디렉토리로 변경합니다. --strip-components는 아카이브에 저장된 파일 이름에서 지정된 수의 디렉토리를 제거합니다.

이것은 실제로 이식 가능하지 않습니다. GNU tar 및 BSD tar 중 일부는 --strip-components 옵션이지만 다른 유닉스 계열 플랫폼에는 존재하지 않는 것 같습니다.

이 작업을 수행하는 바보 같은 방법은 거의 모든 곳에서 작동합니다.

tar xf ugly_name.tar && mv ugly_name pretty_name
187
Mat

GNU tar ≥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!'

POSIX 아카이브 유틸리티 pax 와 함께 -s 옵션. sed와 같은 대체 표현식을 인수로 사용합니다.

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!'

가장 간단한 방법

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

이것을 사용하십시오 :

tar -xvf ugly_name.tar
mv ugly_name pretty_name
9
Rupesh Mande

AskUbuntu에서이 answer 는 저에게 효과적이었습니다.

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

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

Tar에게 추출 디렉토리 (또는`-C '에 전달 된 디렉토리) 아래에 새 디렉토리를 작성하고이를 사용하여 tarbomb을 방지하도록 지시합니다. dir 인수가 없으면 새 디렉토리의 이름은 아카이브의 기본 이름과 같습니다 (파일 이름에서 아카이브 접미어를 뺀 경우). 해당 디렉토리 이름으로 시작하지 않는 멤버 이름 (`--transform '및`--strip-components'에서 변환 한 후)에는 접두사가 붙습니다. 인식되는 파일 이름 접미사는`.tar '이며, 압축 접미어는 -auto-compress 를 참조하십시오.


최신 정보

comments 에서 지적했듯이이 방법은 올바르게 구성된 아카이브에는 작동하지 않지만 다른 답변 이 표시하는 것처럼 --strip-components 1 이것이 실제로 작동합니다. 이 새로운 옵션으로 테스트했으며 최상위 이름의 아카이브와없는 이름의 아카이브 모두에서 작동합니다.

3
smac89