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


124

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

답변:


171

이것은 작동해야합니다 :

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

나는 바보 같은 버전을 고수 할 것 같아요 :)
phunehehe

28
@phunehehe : 스마트 버전의 한 가지 장점은 untarred 디렉토리 이름이 무엇인지 미리 알 필요가 없다는 것입니다
tshepang

2
"Pretty_name"이상에서 작동한다고 덧붙일 수 있습니다. 이 방법으로 특정 디렉토리로 untar 할 수도 있습니다. 예 :tar -xvf /tmp/backupfiles.tar -C /var/www/
General Redneck

2
나는 일반적으로 바보 같은 방법을 사용하고, 추악한 이름이 무엇인지 알지 못하거나 적어두고 싶지 않은 경우 와일드 카드를 사용합니다. mv ugly-* pretty_name
David Grayson

1
이미 ugly_name디렉토리 가 있으면 바보 같은 방식으로 작동하지 않습니다 . 그건 그렇고, 아름다움은 보는 사람의 눈에 있습니다.
kmiklas

30

함께 GNU 타르 ≥1.16, 사용 --transform(변환이 아카이브에 전체 경로에 적용되는) 각 파일 이름에 나오지 정규 표현식 변환을 적용하기 :

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

으로 pax는 POSIX 아카이브 유틸리티, 사용 -s인수로 나오지도 같은 대체 식을 취 옵션을.

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

9

이것을 사용하십시오 :

tar -xvf ugly_name.tar
mv ugly_name pretty_name

9
&&두 명령 사이에 list 연산자 를 사용하는 것이 좋을 수 있으므로 두 번째 명령은 첫 번째 명령이 성공한 경우에만 실행됩니다.
manatwork

1
디렉토리가 ugly_name이미 존재 하는 경우 바람직하지 않은 결과가 발생할 수 있습니다.
Drew Dormann

7

가장 간단한 방법

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

(1) smac89가 (이)--one-top-level=pretty_name없는 답변을 게시 했으므로 이는 가장 간단한 방법이 아닙니다 --strip-components 1. (2) 반대로, (매트에 의해 게시) 허용 대답은 제공 --strip-components 1하지 않고 --one-top-level=pretty_name. (3) 왜 이러한 옵션을 결합하여 당신의 대답이 이전의 것보다 나은지 설명 할 수 있습니까? 의견에 응답하지 마십시오.  명확하고 완전하게 답변을 편집 하십시오.
G-Man

어쩌면 실제 예제는 분명히 도움이 될 수 있습니다 :`wget을 dev.mysql.com/get/Downloads/MySQL-5.7/... 타르 xvf와 mysql을 - 5.7.23 - 리눅스 - glibc2.12-x86_64.tar.gz의 --one 탑 - 레벨 = mysql57 --strip-1 성분 '
marquicus

이 답변은 가장 찬성 한 답변보다 더 우아 합니다 .
KaiserKatze

@ G-Man --strip-component 1mkdir또는 --strip-components 1메소드 와 함께 필요 하지만 그렇지 않으면 얻을 수 pretty_name/ugly_name/있습니다.
davidA

이것은 실제로 가장 간단한 방법입니다
smac89

2

askUbuntu 에서이 답변 은 저에게 효과적 이었습니다.

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

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

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


최신 정보

의견 에서 지적 했듯이이 방법은 올바르게 구성된 아카이브에는 작동하지 않지만 다른 답변에서 볼 수 있듯이 --strip-components 1실제로 작동하려면 추가해야합니다 . 이 새로운 옵션으로 테스트했으며 최상위 이름의 아카이브와없는 이름의 아카이브 모두에서 작동합니다.


이것의 문제는 최상위 디렉토리의 이름을 바꾸지 않고 대신 pretty_name원래 최상위 디렉토리를 가진 이라는 새로운 레벨을 만듭니다 . 예를 들어 , tar xzf ugly_name.tgz이라는 디렉토리를 생성하면 ugly_name/제공 한 명령이 생성 pretty_name/ugly_name/됩니다.
davidA

1
@davidA 좋은 지적입니다. 이 문제에 대한 해결책을 포함하여 답변을 업데이트했습니다
smac89
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.