답변:
이것은 작동해야합니다 :
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
tar -xvf /tmp/backupfiles.tar -C /var/www/
mv ugly-* pretty_name
ugly_name
디렉토리 가 있으면 바보 같은 방식으로 작동하지 않습니다 . 그건 그렇고, 아름다움은 보는 사람의 눈에 있습니다.
함께 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!'
이것을 사용하십시오 :
tar -xvf ugly_name.tar
mv ugly_name pretty_name
&&
두 명령 사이에 list 연산자 를 사용하는 것이 좋을 수 있으므로 두 번째 명령은 첫 번째 명령이 성공한 경우에만 실행됩니다.
ugly_name
이미 존재 하는 경우 바람직하지 않은 결과가 발생할 수 있습니다.
가장 간단한 방법
tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
--one-top-level=pretty_name
없는 답변을 게시 했으므로 이는 가장 간단한 방법이 아닙니다 --strip-components 1
. (2) 반대로, (매트에 의해 게시) 허용 대답은 제공 --strip-components 1
하지 않고 --one-top-level=pretty_name
. (3) 왜 이러한 옵션을 결합하여 당신의 대답이 이전의 것보다 나은지 설명 할 수 있습니까? 의견에 응답하지 마십시오. 명확하고 완전하게 답변을 편집 하십시오.
--strip-component 1
은 mkdir
또는 --strip-components 1
메소드 와 함께 필요 하지만 그렇지 않으면 얻을 수 pretty_name/ugly_name/
있습니다.
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/
됩니다.