curl した tar.gz を解凍すると gzip: invalid magic エラー


curl でダウンロードした tar.gz ファイルを解凍すると gzip: invalid magic エラーが出る。ブラウザなどからダウンロードすると問題ない。

エラー概要
$ curl -S -O https://sample.com/sample.tar.gz \
    && tar -xzvf ./sample.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   129    0   129    0     0    443      0 --:--:-- --:--:-- --:--:--   443
gzip: invalid magic
tar: Child returned status 1
tar: Error is not recoverable: exiting now

「curl gzip: invalid magic」で Qiita 記事をググってもヒットしなかったので、自分のググラビリティと戒めとして。

TL; DR (今北産業)

  1. gzip: invalid magic エラー自体は「ファイルが壊れている」という意味です。
  2. ダウンロードしたファイルを cat などで開いてみてください。おそらく curl 時に -L オプションが抜けていたため、リダイレクトに失敗しています。
  3. curl-L オプションをつけるとリダイレクト先からダウンロードされるようになります。

TS; DR

ファイルが壊れているとばかり思い込んでいたのですが、curl 単体でダウンロードを試してみると妙にサイズが小さいことに気づきました。

$ curl -S -O https://github.com/tensorflow/tensorflow/archive/v1.8.0.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   129    0   129    0     0    440      0 --:--:-- --:--:-- --:--:--   441
$ ls -la
total 8
drwxr-xr-x  3 admin  staff  102  9  3 19:53 .
drwxr-xr-x  8 admin  staff  272  9  3 19:53 ..
-rw-r--r--  1 admin  staff  129  9  3 19:47 v1.8.0.tar.gz
$ cat v1.8.0.tar.gz
<html><body>You are being <a href="https://codeload.github.com/tensorflow/tensorflow/tar.gz/v1.8.0">redirected</a>.</body></html>

cat コマンドで中身を見ると、なんと「リダイレクトされてるよん」と HTML のエラーページをダウンロードしておりました!そりゃ解凍もできませんわね。

1つ1つ確認せずに、横着して一気にコマンドを実行したことが災いしました。とほほ。

  • 検証環境:
    • macOS Mojave(OSX 10.14.6)
    • curl: v7.54.0
    • tar: bsdtar v2.8.3