타르 추출은 파일 이름에 의존합니까?


33

나는 종종 sourceforge.net에서 wget으로 tarball을 다운로드합니다.

다운로드 된 파일의 이름은 다음과 같습니다. SQliteManager-1.2.4.tar.gz?r=http:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F&ts=1305711521&use_mirror=switch

내가하려고 할 때

tar xzf SQliteManager-1.2.4.tar.gz\?r\=http\:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F\&ts\=1305711521\&use_mirror\=switch

다음과 같은 오류 메시지가 나타납니다.

tar (child): Cannot connect to SQliteManager-1.2.4.tar.gz?r=http: resolve failed

gzip: stdin: unexpected end of file
tar: Child returned status 128
tar: Error is not recoverable: exiting now

파일 이름을 foo.tar.gz추출로 바꾸면 완벽하게 작동합니다.

추출하기 전에 대상 파일을 이름을 바꿀 때마다 강제로 이름을 바꾸지 않는 방법이 있습니까?

답변:


50

보고있는 오류의 이유는 GNU tar 설명서 에서 찾을 수 있습니다 .

아카이브 파일 이름에 콜론 ( ':')이 포함되어 있으면 다른 머신의 파일 인 것으로 간주됩니다 [...]

즉, SQliteManager-1.2.4.tar.gz?r=http호스트 이름으로 해석 하여 IP 주소로 해석하려고하므로 "해결 실패"오류입니다.

똑같은 문서는 다음과 같이 말합니다.

이름에 콜론이 포함 된 파일을 사용해야하는 경우 '--force-local'옵션을 사용하여 원격 테이프 드라이브 동작을 억제 할 수 있습니다.


참고 --force-local있다가 앞에 추가 할 f내가 처음이가 나에게로 그런 파일이 없습니다 방법에 대한 오류 메시지를주고 있었다 시도 할 때 ... --force-local. 어쩌면 이것은 "아니오"일지도 모르지만 5 분 후에 내가 저지른 실수를 인식하지 못했습니다.
ArtOfWarfare

@ArtOfWarfare : ftarfile 인 인수를 사용합니다. 당신은 넣을 수 없습니다 --force-local사이 f및 인수,하지만 그건 단지, 모든 프로그램에 대한 표준 tar뿐 아니라 -f. 당신은 넣을 수 있습니다 --force-localf가의 인수 후도 긴만큼 f.
camh

내 의견에서 말했듯이 너무 "아니오"일 수 있습니다. 나는 이런 식으로 tar를 사용 tar -cvzf ...하고 각 플래그가 실제로 99 %의 시간에 대해 생각조차하지 않습니다-그것이 tar.gz를 만드는 방법이라는 것이 단지 반사적입니다.
ArtOfWarfare

이 메모에서,이 두 사람 (@ArtOfWarfare와 @camh)이 여기에 말하는 내용에 더 도움이되는 예는 다음과 같습니다. tar zxvf C:\Users\jdoe\Documents\tarfile.tgz --force-local
Dan

6

로 다운로드 할 때 옵션으로 wget출력 파일 이름을 지정하십시오 -O.

wget "http://domain.com/file.tgz?crazy=args&stuff=todelete" -O file.tgz

그러면 파일이 지정된 파일 이름으로 저장되어 문제가 발생하거나 이름이 변경됩니다. 그리고 당신은 sourcefourge가 url 매개 변수가 첨부 된 파일을 전달하기에 너무 멍청하지 않기를 바라는 유일한 사람이 아닙니다.


이것은 SourceForge의 잘못이 아니라 wget의입니다. --content-disposition플래그를 사용하여 서버 지정 파일 이름으로 저장하십시오 (그러나 SourceForge는 임의의 파일 이름으로 쓸 수 있으므로 보안 관련 사항에주의하십시오).
pcworld

4

를 사용하여 다운로드

wget --trust-server-names URL

그렇게하면 wget은 올바른 파일 이름으로 저장합니다. 기본적으로 URL의 마지막 구성 요소를 사용합니다

예를 들어

wget --trust-server-names http://sourceforge.net/projects/sqlitemanager/files/sqlitemanager/1.2.4/SQliteManager-1.2.4.tar.gz/download

4

위에서 언급했듯이 :(열) tar은 원격 파일이라고 생각합니다. 따라서 우리는 그것이 사실이라는 사실을 강요해야합니다.

실패

$ tar czf "back$(date -u +"%H:%M").tar.gz" ./
tar (child): Cannot connect to back10: resolve failed
tar: Child returned status 128
tar: Error is not recoverable: exiting now

해결책

./(현재 디렉토리) 를 추가 하고 올바르게 인용 하여 로컬 파일이라는 사실을 명시하십시오 .

$ tar czf ./"back$(date -u +'%H:%M').tar.gz" ./
tar: .: file changed as we read it

경고는 소스 디렉토리에서 작성 중이기 때문입니다.


긴 플래그를 사용하는 것보다 훨씬 낫습니다. 또한이 목적을 달성하기위한 특정 도구가 있지만 원격 호스트 다운로드는 쓸모없는 옵션이라고 생각합니다.
Alireza Mohamadi

3

이미 다운로드 한 파일의 경우 다음과 같이 작동합니다.

tar xzf - < SQliteManager-1.2.4.tar.gz*
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.