2017-02-10 10 views
1

私は、tarファイルに含まれるすべてのファイルに対してsha-256の値を計算する方法を探しています。問題は、タールが200GB以上のファイルを含む300GBであることです。tarファイル内のすべてのファイルのshasumを計算する方法

これをbashで行うには、いくつかの異なる方法があります。

を抽出し、それが動作する300ギガバイトのスペースのスペースを必要とし、それを合計

を計算する前にデータをコピーする必要があるため遅いので、その後find

tmp=`mktmp --directory extract_XXX` 
cd "$tmp" 
tar -xf "$tarfile" 
find "$tmp" -type f -exec shasum -ba 256 {} + 
cd .. 
rm -rf "$tmp" 

この方法が悪いを使用tarファイルをリストし、個々の合計を計算する

tar -tf "$tarfile" awk '/\/$/ {next} {print $0}' | while read file ; do 
    sum=`tar -xOf "$tarfile" "$file" | shasum -ba 256` 
    echo "${sum%-}${file}" 
done 

これは、より少ないディスクスペースが必要ですが

どのように私は一時ディレクトリにそれを抽出することなくtarファイルの単一パスでこれを行うことができますはるかに遅いのですか?

私はこれをbashとpythonとタグ付けしました...現在のコードはbashですが、私は言語について柔軟です。

答えて

3

tarユーティリティは、その方法を知っている: tar xvf "$tarfile" --to-command 'shasum -ba 256' ためtar-vフラグが重要ですコマンドの標準入力で各ファイルを送信します。それは次の行のSHA合計を1行に出力しますが、それをさらに簡単に処理できます。

編集:ここに完全なシェルが1回のtarファイルのパスでSHA256sを出力するだけのコードです: glibc-2.24/.gitattributes c3f8f279e7e7b0020028d06de61274b00b6cb84cfd005a8f380c014ef89ddf48 glibc-2.24/.gitignore 35bcd2a1d99fbb76087dc077b3e754d657118f353c3d76058f6c35c8c7f7abae glibc-2.24/BUGS 9b2d4b25c8600508e1d148feeaed5da04a13daf988d5854012aebcc37fd84ef6 glibc-2.24/CONFORMANCE 66b6e97c93a2381711f84f34134e8910ef4ee4a8dc55a049a355f3a7582807ec


編集:glibcのソースアーカイブについて shopt -s extglob tar xvf "$tarfile" --to-command 'shasum -ba 256' | \ while read L; do [[ $L == *" *-" ]] && echo $SHAFILE ${L:0:64} || SHAFILE=$L done 、出力は次のようになりますOPで:ワンライナーとして

これを行うことができますように。

tar xf "$tarfile" --to-command 'bash -c "sum=`shasum -ba 256`; echo \"\${sum%-}$TAR_FILENAME\""' 

マニュアルページ:https://www.gnu.org/software/tar/manual/tar.html#SEC87

1

私はそれがなるどれだけ速く知りませんが、Pythonで、それは次のように行うことができます。

import tarfile 
import hashlib 

def sha256(flo): 
    hash_sha256 = hashlib.sha256() 
    for chunk in iter(lambda: flo.read(4096), b'') 
     hash_sha256.update(chunk) 
    return hash_sha256.hexdigest() 

with tarfile.open('/path/to/tar/file') as mytar: 
    for member in mytar.getmembers(): 
     with mytar.extractfile(member) as _file: 
      print('{} {}'.format(sha256(_file), member.name)) 
関連する問題