web-dev-qa-db-ja.com

tar抽出はファイル名に依存しますか?

私はしばしば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に変更すると、抽出は完全に機能します。

抽出する前にターゲットファイルを毎回名前変更する必要がない方法はありますか?

34
casper

あなたが見ているエラーの理由は GNU tarドキュメント で見つけることができます:

アーカイブファイル名にコロン( ‘:’)が含まれている場合は、別のマシン上のファイルと見なされます[...]

つまり、それはSQliteManager-1.2.4.tar.gz?r=httpをホスト名としてIPアドレスに解決しようとしているため、「解決失敗」エラー。

同じドキュメントは続けて言っています:

名前にコロンが含まれているファイルを使用する必要がある場合は、「-force-local」オプションを使用して、リモートテープドライブの動作を禁止できます。

51
camh

wgetを使用してダウンロードする場合は、-Oオプションを使用して出力ファイル名を指定します。

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

これにより、ファイルは指定されたファイル名で保存され、問題やファイル名の変更を節約できます。そして、いいえ、sourcefourgeがurlパラメータが添付されたファイルを渡すほど馬鹿にならないことを望んでいるのはあなただけではありません。

6
Caleb

使用してダウンロード

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
freethinker

上記のように、:(列)は、tarをリモートファイルであると見なします。したがって、ローカルであることを強制する必要があります。

Fail

$ 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

警告は、ソースディレクトリに作成しているためです。

4
Édouard Lopez

すでにダウンロードされたファイルの場合、これはうまくいくはずです:

tar xzf - < SQliteManager-1.2.4.tar.gz*
3
jlliagre