동일한 기본 이름을 가진 디렉토리로 tar 추출? 있는지 모른다. 폴더 일 수도 있고 많은

와 같은 압축 파일이 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

이것을 할 수 있습니까?

  • 나는 아카이브 안에 무엇이 있는지 모른다. 폴더 일 수도 있고 많은 파일 일 수도 있습니다.
  • 타르가 할 수 없다면 다른 도구를 사용해도 괜찮습니다.
  • 스크립트로 바꿀 수있는 더 긴 양식으로 괜찮을 것입니다.

편집
그 동안 나는 일을 끝내는 것처럼 보이는 스크립트를 스스로 해킹했다. (아래에 게시 된 답변 참조). 개선 될 수 있다면 의견 / 추가 답변을 자유롭게 게시하십시오. 가장 중요한 것은 다음과 같은 단일 라이너로 패키지 가능해야한다는 것입니다.

extract <file>



답변

를 사용하면 (또는 )를 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 %. *} # 마지막 접미사 제거
NAME = $ {STRIP % .tar} #strip .tar 접미사 (있는 경우)
tar -xf "$ 1"--xform = "s | ^ | $ NAME / | S"#run 명령


답변

글쎄, 당신은 적어도 몇 단계로 그것을 할 수 있습니다. 네가했다면

mkdir <archive name>
tar -xf <archive name>.tar.gz --strip-components=1 -C <archive name>

아직 더 간단한 답변이있을 수 있지만 그 작업을 수행 할 것입니다.


답변

편집하다

허용되는 답변은 아래보다 짧습니다. (같은 작업을 수행하지만 일반적으로 짧을수록 좋습니다.)


나는 결국 작업에 대한 스크립트를 해킹했다. .tar .tar.gz 및 .gz와 함께 작동합니다.

#!/bin/sh
#usage:
# nameOfScript myArchive.tar.gz
# nameOfScript myArchive.gz
# nameOfScript myArchive.tar
#
# Result:
# myArchive   //folder
fileName="${1%.*}" #extracted filename

#handle the case of archive.tar.gz
trailingExtension="${fileName##*.}"
if [ "$trailingExtension" == "tar" ]
then
    fileName="${fileName%.*}"  #remove trailing  tar.
fi

mkdir "$fileName"
tar -xf "$1" --strip-components=0 -C "$fileName"

용법:

   nameOfScript archive.tar.gz
   ls
    archive
   cd archive
   ls
    <archive content>

이 솔루션은 파일 이름에 점을 표시 할 수 있습니다. 예 : Eclipse-4.5M-SDK.tar.gz.

스크립트를 git repo에 보관합니다. 최신 버전은 https://github.com/LeoUfimtsev/ldts/blob/master/pathscripts/leo-tar-here를 참조하십시오.


답변

하나 더 가능한 해결책은 --transform옵션을 사용하는 것입니다.

tar -xzf ARCHIVE_NAME.tgz --transform="s/OLD_DIR_NAME/ARCHIVE_NAME/"

파일로 :

tar -xzf myArchive123.tar.gz --transform="s/helloWorld/myArchive123/"


답변