압축을 풀면 디렉터리가 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!'
그리고pax
POSIX 아카이브 유틸리티인 은 -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!'
답변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에서 인식하는 모든 압축 접미사는-자동 압축.