tar: Error exit delayed from previous errors. はファイルの破損が原因だった話

#環境
iMac (2017)
macOS Big Sir ver 11.4

#状況
wgetコマンドを使ってftp経由でダウンロードしたファイルが解凍できない。
以下詳細です。

NCBIのftpサイト（<https://ftp.ncbi.nlm.nih.gov/>）に公開されている、
ヒトリファレンスゲノム配列（hg38）用のpre-built indexをwgetコマンドでダウンロードした。

```:Terminal
% wget ftp://ftp.ncbi.nlm.nih.gov/genomes/archive/old_genbank/Eukaryotes/vertebrates_mammals/Homo_sapiens/GRCh38/seqs_for_alignment_pipelines/GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz
```
今回ダウンロードしてるtar.gzファイルは、3.5GB以上の重いファイルです。
wgetでtar.gzファイルダウンロードしていた時に何度も接続が切れて、以下の通りにダウンロード中に接続→切断→再試行を何度も繰り返していました。時間はかかったが、なんとかダウンロード完了。
果たして正常にダウンロードが完了できているのだろうか。。。。と思いながら次へ進む（これが悲劇の始まりでした）。

```:Terminal
GCA_000001405.15_GRCh38_n  14%[====>                                 ] 507.67M   439KB/s 時間 12m 38s  

2021-07-27 10:12:51 (686 KB/s) - 制御用の接続を切断します。
再試行しています。

--2021-07-27 10:12:52--  ftp://ftp.ncbi.nlm.nih.gov/genomes/archive/old_genbank/Eukaryotes/vertebrates_mammals/Homo_sapiens/GRCh38/seqs_for_alignment_pipelines/GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz
  (試行: 2) => `GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz'
ftp.ncbi.nlm.nih.gov (ftp.ncbi.nlm.nih.gov)|130.14.250.12|:21 に接続しています... 接続しました。

```
tar xvzfで解凍してみるとエラーが出る。

```:Terminal
%tar xvzf GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz
x GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.1.bt2: gzip decompression failed
tar: Error exit delayed from previous errors.
```
ひとつだけファイルができて止まってしまった。


##解凍エラーの原因を探るため確認したこと
####1. typoによるtarコマンドのミスがないか確認
typoはない。タブで予測入力したから間違えようがない。

####2. tarコマンドが正常に機能していることを確認
まずはtarコマンドのフルパス取得。

```:Terminal
% which tar
/usr/bin/tar
```
ヘルプを表示させてみる。

```:Terminal
% tar --help
tar(bsdtar): manipulate archive files
First option must be a mode specifier:
 -c Create  -r Add/Replace  -t List  -u Update  -x Extract
Common Options:
 -b #  Use # 512-byte records per I/O block
(以下省略)
```

別のtar.gz形式のファイルが解凍できることを確認。

```:Terminal
% tar xvzf annovar.latest.tar.gz　
```
別のファイルなら問題なく解凍できた。Tarコマンド自体は正常に機能していそうだ。

####3. PCなのか、ファイルなのか問題を切り分け。
別のPC（2017 MacBook corei5、mac OS Sierra v 10.12.6）でも解凍できるかどうか確認してみた。

```:Terminal
%tar xvzf GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz
x GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.1.bt2: gzip decompression failed
tar: Error exit delayed from previous errors.
```
やはりエラーが出る。ファイルの破損が原因か？


##ファイルの破損がないか確認 （これがエラーの原因でした）
今回は、MD5のハッシュ値を用いて、ファイルの破損がないことを確認しました。
**MD5(Message Digest 5)とは、任意の長さの原文を元に128ビットの値を生成するハッシュ関数（要約関数）の一つ。生成された値はハッシュ値と呼ばれる。データの伝送や複製を行なう際に、入力側と出力側でハッシュ値を求め一致すれば、途中で改ざんや欠落などが起こっていないことを確認することができる。**

NCBIのような大規模公開データベースではMD5ファイルリストが原則公開されている。
今回の場合は以下のURLに、該当ファイルのMD5のハッシュ値が公開されていたので確認。
<https://ftp.ncbi.nlm.nih.gov/genomes/archive/old_genbank/Eukaryotes/vertebrates_mammals/Homo_sapiens/GRCh38/md5checksums.txt>

```
3f493e82d549f1d476491930965c10d0  ./seqs_for_alignment_pipelines/GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz
```
「3f493e82d549f1d476491930965c10d0」というのがNCBIで公開されている該当ファイルのハッシュ値。
このダウンロード元のNCBIでハッシュ値と、私がダウンロードしたファイルのハッシュ値を比較することでデータの欠損がないことを確認できるということですね。
ということで、自分がダウンロードした解凍できないtar.gzファイルのハッシュ値を確認。

```:Terminal
% md5 GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz
MD5 (GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz) = 97690dbb2abb2da0485ae6cef749f9ff
```
「97690dbb2abb2da0485ae6cef749f9ff」→自分がダウンロードした解凍できないtar.gzファイルのハッシュ値
「3f493e82d549f1d476491930965c10d0」→NCBIで公開されている該当tar.gzファイルのハッシュ値

ハッシュ値が全然違う！！ということは、ダウンロードしたものは元のファイルとは別物。
つまり、ダウンロードがうまくいっていないということですね。

##解凍したいtar.gzファイルを再ダウンロード
####1. wgetコマンドを使い、ファイルの再ダウンロード  (→最終的には断念)
ファイルが破損している可能性が濃厚なので再ダウンロードしてみた。

```:Terminal
% wget ftp://ftp.ncbi.nlm.nih.gov/genomes/archive/old_genbank/Eukaryotes/vertebrates_mammals/Homo_sapiens/GRCh38/seqs_for_alignment_pipelines/GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz
```
ダウンロードの途中でFTP接続が何度も切断し、試行回数が20を超えたところで、FTP接続が中止してしまった。

```:Terminal
  (試行:20) => `GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz'
ftp.ncbi.nlm.nih.gov (ftp.ncbi.nlm.nih.gov)|130.14.250.12|:21 に接続しています... 接続しました。
anonymous としてログインしています... ログインしました!
==> SYST ... 完了しました。    ==> PWD ... 完了しました。
==> TYPE I ... 完了しました。  ==> CWD (1) /genomes/archive/old_genbank/Eukaryotes/vertebrates_mammals/Homo_sapiens/GRCh38/seqs_for_alignment_pipelines ... 完了しました。
==> SIZE GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz ... 3749247988
==> PASV ... 完了しました。    ==> REST 2880160992 ... 完了しました。    
==> RETR GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz ... 完了しました。
長さ: 3749247988 (3.5G), 869086996 (829M) 残っています (確証はありません)

GCA_000001405.15_GRCh38_n  76%[+++++++++++++++++++++++++++++         ]   2.69G  63.5KB/s 時間 69s      

2021-07-27 12:07:07 (66.6 KB/s) - 制御用の接続を切断します。
中止しました。
%
```
wgetでの再ダウンロードは諦めて別の方法を試すことにする。

####2. lfptコマンドを使い、ファイルの再ダウンロード (→最終的には断念)
まずはftpサイトの一つ前のディレクトリまで移動

```:Terminal
lftp ftp://ftp.ncbi.nlm.nih.gov/genomes/archive/old_genbank/Eukaryotes/vertebrates_mammals/Homo_sapiens/GRCh38/seqs_for_alignment_pipelines/
cd 成功、cwd=/genomes/archive/old_genbank/Eukaryotes/vertebrates_mammals/Homo_sapiens/GRCh38/seqs_for_alignment_pipelines
```
次に、ほしいファイルがあるかを確認

```:Terminal
lftp ftp.ncbi.nlm.nih.gov:/genomes/archive/old_genbank/Eukaryotes/vertebrates_mammals/Homo_sapiens/GRCh38/seqs_for_alignment_pipelines> ls
-r--r--r--   1 ftp      anonymous 3870038614 Nov 19  2014 GCA_000001405.15_GRCh38_full_analysis_set.fna.bowtie_index.tar.gz
-r--r--r--   1 ftp      anonymous 3558456939 Jan 28  2015 GCA_000001405.15_GRCh38_full_analysis_set.fna.bwa_index.tar.gz
-r--r--r--   1 ftp      anonymous    19427 Nov 18  2014 GCA_000001405.15_GRCh38_full_analysis_set.fna.fai
-r--r--r--   1 ftp      anonymous 903026760 Jan 11  2014 GCA_000001405.15_GRCh38_full_analysis_set.fna.gz
-r--r--r--   1 ftp      anonymous 26158605 Nov 15  2014 GCA_000001405.15_GRCh38_full_analysis_set.refseq_annotation.gff.gz
-r--r--r--   1 ftp      anonymous 3261550200 Jan 22  2015 GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set.fna
-r--r--r--   1 ftp      anonymous 3877331854 Jan 28  2015 GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set.fna.bowtie_index.tar.gz
-r--r--r--   1 ftp      anonymous 3564745950 Jan 28  2015 GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set.fna.bwa_index.tar.gz
-r--r--r--   1 ftp      anonymous   134770 Jan 23  2015 GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set.fna.fai
-r--r--r--   1 ftp      anonymous 3749247988 Nov 19  2014 GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz
-r--r--r--   1 ftp      anonymous 3445310260 Jul  1  2014 GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bwa_index.tar.gz
-r--r--r--   1 ftp      anonymous     7804 Nov 18  2014 GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.fai
-r--r--r--   1 ftp      anonymous 872949833 Jan 11  2014 GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.gz
-r--r--r--   1 ftp      anonymous    11646 Jan 15  2016 README_ANALYSIS_SETS
```
目的のファイルが見つかったので、getコマンドでダウンロードしてみる。

```:Terminal
lftp ftp.ncbi.nlm.nih.gov:/genomes/archive/old_genbank/Eukaryotes/vertebrates_mammals/Homo_sapiens/GRCh38/seqs_for_alignment_pipelines> get GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz
`GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz' (現在 17251848 バイト) (0%) 292.1KB/s  eta:5h37m [データ受信中] 
```
5時間以上かかるか。。。。。別のパソコンでhttpサイトからのダウンロードも試してみよう。

(結局、以下のhttpサイトからのダウンロードの方が早かったのでlftpコマンドは途中終了("control" + "c")した)

```:Terminal
^C
中断します
lftp ftp.ncbi.nlm.nih.gov:/genomes/archive/old_genbank/Eukaryotes/vertebrates_mammals/Homo_sapiens/GRCh38/seqs_for_alignment_pipelines> quit
%
```


####3. httpサイトから、ファイルの再ダウンロード →うまくいった！
FTPサイトは諦めて、以下のHTTPのwebブラウザにアクセスし、該当のファイル「GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz」をダウンロード。
https://ftp.ncbi.nlm.nih.gov/genomes/archive/old_genbank/Eukaryotes/vertebrates_mammals/Homo_sapiens/GRCh38/seqs_for_alignment_pipelines/
→今回はlftpコマンドよりもこちらの方が早く終わりました。

#再ダウンロードした圧縮ファイルtar.gzを解凍

#####1. 再ダウンロードしたtar.gzファイルのMD5のハッシュ値を確認

```:Terminal
 % md5 GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz 
MD5 (GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz) = 3f493e82d549f1d476491930965c10d0
```
再ダウンロードしたファイルのハッシュ値は、[NCBIが公開しているハッシュ値](https://ftp.ncbi.nlm.nih.gov/genomes/archive/old_genbank/Eukaryotes/vertebrates_mammals/Homo_sapiens/GRCh38/md5checksums.txt)と一致する。今度はファイルの破損はなさそう。

#####2. 解凍してみる

```Bash:Terminal
% tar xvzf GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.tar.gz 
x GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.1.bt2
x GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.2.bt2
x GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.3.bt2
x GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.4.bt2
x GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.rev.1.bt2
x GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.bowtie_index.rev.2.bt2
%
```

解凍できた！！！！！
結果、解凍できないのはファイルの破損が原因だった。

##改めてはじめのエラーメッセージを見直した

```:Terminal
tar: Error exit delayed from previous errors.
```
以前のエラーから遅れた異常終了？...は？
delayの単語を調べると「進行を妨げる」という意味もあるらしい。
つまり、**「以前のエラーに邪魔されて異常終了しました」**ってことか。
今回の場合、解凍前の以前のエラーというとダウンロード中のエラーしかない。
なるほど、エラーメッセージに解凍できない理由、ダウンロード中にエラーがあったことがバッチリ書かれていたのね。

##教訓
1. 4GB近い大きなファイルをダウンロードした時は、ハッシュ値を調べてファイル破損がないことを確認しよう。
2. 次からもっとしっかりとエラーメッセージを読もう。

長い戦いだった。。。。

#参考
<https://e-words.jp/w/MD5.html>

<https://chiritsumo-blog.com/mac-hash/>