私はしばしば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
に変更すると、抽出は完全に機能します。
抽出する前にターゲットファイルを毎回名前変更する必要がない方法はありますか?
あなたが見ているエラーの理由は GNU tarドキュメント で見つけることができます:
アーカイブファイル名にコロン( ‘:’)が含まれている場合は、別のマシン上のファイルと見なされます[...]
つまり、それはSQliteManager-1.2.4.tar.gz?r=http
をホスト名としてIPアドレスに解決しようとしているため、「解決失敗」エラー。
同じドキュメントは続けて言っています:
名前にコロンが含まれているファイルを使用する必要がある場合は、「-force-local」オプションを使用して、リモートテープドライブの動作を禁止できます。
wget
を使用してダウンロードする場合は、-O
オプションを使用して出力ファイル名を指定します。
wget "http://domain.com/file.tgz?crazy=args&stuff=todelete" -O file.tgz
これにより、ファイルは指定されたファイル名で保存され、問題やファイル名の変更を節約できます。そして、いいえ、sourcefourgeがurlパラメータが添付されたファイルを渡すほど馬鹿にならないことを望んでいるのはあなただけではありません。
使用してダウンロード
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
上記のように、:
(列)は、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
警告は、ソースディレクトリに作成しているためです。
すでにダウンロードされたファイルの場合、これはうまくいくはずです:
tar xzf - < SQliteManager-1.2.4.tar.gz*