예를 들어 zip 파일이 있습니다 myArchive123.tar.gz
. 그 안에는 다음과 같은 폴더가 포함되어 있습니다.helloWorld
다음을 사용하여 추출 하면 tar -xf myArchive123.tar.gz
:helloWorld
ls
myArchive123.tar.gz
helloWorld
출력이 파일 이름에서 확장자를 뺀 것과 동일해지기를 원합니다 .tar.gz
. 즉:
tar <magic paramaters> myArchive123.tar.gz
ls
myArchive123.tar.gz
myArchive123
cd myArchive123
ls
helloWorld
이것이 가능합니까?
- 나는 기록 보관소에 무엇이 있는지 전혀 모릅니다. 폴더일 수도 있고 여러 파일일 수도 있습니다.
- tar가 할 수 없으면 다른 도구를 사용할 수 있습니다.
- 스크립트로 변환할 수 있는 더 긴 형식도 괜찮습니다.
편집하다
그 동안 나는 그 일을 하는 것처럼 보이는 스크립트를 직접 작성했습니다(아래 게시된 답변 참조). 가장 중요한 것은 한 줄의 코드로 패키지되어야 한다는 것입니다. 예를 들면 다음과 같습니다.
extract <file>
답변1
$ tar -xf myArchive123.tar.gz --one-top-level
--최상위 수준[=DIR]
모든 파일을 DIR로 추출하거나, 인수 없이 사용하는 경우 아카이브의 기본 이름(--auto-compress에서 인식하는 표준 압축 접미사 빼기)을 따라 이름이 지정된 하위 디렉토리에 추출합니다.
답변2
를 사용하려면 각 파일 이름 앞에 (or)를 붙일 gnu tar
수 있습니다 .--xform
--transform
/prefix/
tar -xf myArchive.tar.gz --xform='s|^|myArchive/|S'
/
선행 이 없으며 prefix/
표현식은 파일 이름 변환에서 심볼릭 링크 대상을 제외하는 것으로 끝납니다 sed
. 테스트해 보세요(모의 실행).S
tar -tf myArchive.tar.gz --xform='s|^|myArchive/|S' --verbose --show-transformed-names
시작하는 데 도움이 되도록 호출할 수 있는 매우 간단한 스크립트는 다음과 같습니다 extract <file>
.
STRIP=${1%.*} #마지막 접미사 제거 이름=${STRIP%.tar} #strip. 아스팔트접미사(있는 경우) tar -xf "$1" --xform="s|^|$NAME/|S" # 명령 실행
답변3
글쎄요, 최소한 몇 단계만 거치면 가능합니다. 당신이 그렇게한다면
mkdir <archive name>
tar -xf <archive name>.tar.gz --strip-components=1 -C <archive name>
더 간결한 답변이 있을 수 있지만 이렇게 하면 작업이 완료됩니다.
답변4
--transform
또 다른 가능한 해결책은 다음 옵션을 사용하는 것입니다 .
tar -xzf ARCHIVE_NAME.tgz --transform="s/OLD_DIR_NAME/ARCHIVE_NAME/"
파일로:
tar -xzf myArchive123.tar.gz --transform="s/helloWorld/myArchive123/"