web-dev-qa-db-ja.com

再帰的チェックサム

次のコマンドラインを使用して、ディレクトリの再帰的なチェックサムを実行しています。それは仕事をやり遂げたようですが、私はまだ初心者だと思っていますが、この方法でそれを行うことには潜在的な問題がありますか?このコマンドでファイルを見逃したり、混乱したりする可能性はありますか?

find ./dir/ -type f -exec sha1sum {} \; > files.sha1
3
user2089518

あなたのアプローチには何の問題もありません。ディレクトリを除外し、findにはデフォルトで隠しファイルが含まれます。ええ、大丈夫です。

しかし、私はあなたに代わりを提供します。

shopt -s globstar dotglob
sha1sum **

globstar**の再帰的な一致を有効にし、dotglobは隠しファイルの一致を有効にします。それらの間で、それらはすべてのファイル名に展開され、sha1sumはそれらをすべて解析できます。

このアプローチの主な問題は、allファイル名を1つの太い山でsha1sumに渡すことです。これは小さな負荷では多少高速になりますが、ファイル名が多すぎると爆発します。カットオフが何なのかわかりません。

6
Oli

Hashlibとos.walkを使用したPythonスクリプト

findglobstarを使用するほかに、pythonにはハッシュサム計算とディレクトリツリーの再帰ウォークのためのモジュールがあります。したがって、提示されたとおりの簡単なスクリプトを書くことができます。実際、このスクリプトは、私が この回答 に使用したものとほとんど同じですが、わずかな違いがあります。

このスクリプトは、現在の作業ディレクトリを再帰的にウォークスルーすることを前提としているため、最初にcdを目的の最上位ディレクトリに移動してください。

また、~/binディレクトリに保存して、使用前にsource ~/.bashrcを実行することをお勧めします。この方法では、コマンドラインでスクリプトの名前を入力するだけです。

このスクリプトは、隠しファイルを含むすべてのファイルを収集します(ファイル名の先頭にドットが付きます)。

スクリプトソース

#!/usr/bin/env python3
import os
import sys
from hashlib import sha1

def get_sha1sum(file_path):
    sha1sum = sha1()
    with open(file_path, 'rb') as fd:
        data_chunk = fd.read(1024)
        while data_chunk:
              sha1sum.update(data_chunk)
              data_chunk = fd.read(1024)
    return str(sha1sum.hexdigest())

def find_files(treeroot):
    for dir,subdirs,files in os.walk(treeroot):
         for f in files: 
             full_path = os.path.join(dir,f)
             path_sha1sum = get_sha1sum( full_path  )
             print(path_sha1sum,full_path)

def main():
    find_files('.')

if __== '__main__': main()

デモ実行

bash-4.3$ cd Wallpapers/
bash-4.3$ recursive_checksum.py 
c66af072272d2c516e29832d0a86afa0e8e61d8c ./moon_moon.jpg
37829801c48ea0420414fc78de45adb13e4b117f ./wat.png
6cc3dd2541d00aa5fb8fd6ec703d3c7653ce4708 ./hard_drive_wallpapers/hard-drive.jpg
52fbff84cba6bbbfadc5777c1189ec39aef9176a ./hard_drive_wallpapers/hard-drive5.jpg
5bfe52eb8b31f50dc7bd1b1991dcc1d7260ec65e ./hard_drive_wallpapers/hard-drive4.jpg
f2f85eaa24c8c5b82bbedd55f887ea5fc520ac21 ./hard_drive_wallpapers/hard-drive3.jpg
bcdcf278c176fa93557627a33bedebe4e508e27a ./hard_drive_wallpapers/hard-drive2.jpg
0