동일한 기본 이름을 가진 디렉토리로 tar 추출?


18

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

1
아카이브에는 항상 정확히 하나의 폴더가 포함되어 있습니까?
Mark Plotnick


추출 시간에 무엇이 들어 있는지 알 수 없습니다. 이것은 아카이브 내부의 내용에 의존해서는 안됩니다. 폴더 인 경우 폴더를 추출하십시오. 파일 인 경우 모든 파일을 추출하십시오.
레오 Ufimtsev

그 사이에 스크립트를 작성했습니다 (아래 참조). 2 일만에 답변을받을 수 있습니다.
Leo Ufimtsev

아카이브에 최상위 레벨에 둘 이상의 폴더가 포함됩니까?
Mark Plotnick

답변:


10

를 사용하면 (또는 )를 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 명령

이것은 내가 원하는 것과 비슷하지만, 다음과 같이 패키지화하고 싶다는 것을 제외하고 : extract <file>
Leo Ufimtsev

이것은 버그가 있으며 첫 번째 점에서 멈 춥니 다. 예를 들어 다음과 같은 파일이 있습니다 : eclipse-SDK-4.5M6-linux-gtk-x86_64.tar.gz .tar.gz가없는 출력을 기대하지만 eclipse-sdk-4를 얻습니다
Leo Ufimtsev

위의 스크립트에서 확장을 제거하고 'tar'을 찾으면 더 확장하십시오.
레오 Ufimtsev

일반적으로 많은 유형의 아카이브가 있습니다. 나는 빠른 원 라이너를 기대하고 있었는데, 아마도 인수 플래그가 누락되었다고 생각했습니다. 그러나 이것에 대한 사소한 해결책이없는 것 같습니다.
레오 Ufimtsev

좋은 물건. 이것은 작동하며 내가 쓴 스크립트보다 짧습니다. 좋은!
Leo Ufimtsev

7

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

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

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


3

편집하다

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


나는 결국 작업에 대한 스크립트를 해킹했다. .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를 참조하십시오.


2

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

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

파일로 :

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

1
그러나 이것은 당신이 아카이브 안에 무엇이 있는지 아는 것을 전제로합니다
Leo Ufimtsev

예를 들어, 아카이브 내부에 무엇이 있는지 모른 채 어떻게 이것을 한 줄 스크립트로 바꿀 수 있습니까?
Leo Ufimtsev

당신은 맞습니다. 내가 여기에 썼을 때 가능한 한가지 해결책
일뿐입니다

그것과 --strip-compoments = 0 myArchive123 사이에 차이점이 있습니까?
Leo Ufimtsev

1
그리고 --strip-components=0단순히 경로에서와 함께 최초의 디렉토리 이름을 제거 -C새 디렉토리에 파일을 보관 드 - 옵션 저장합니다.
svq
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.