web-dev-qa-db-ja.com

既知のsha1合計を含む検索ファイル

Sha1 sumが既知の特定のファイルを見つけなければなりません。ファイルがどのフォルダーにあるべきかはわかっていますが、サブフォルダーがあります(最大深度4まで)。多かれ少なかれファイル名の一部(「project」と「screenshoot」という単語を含む)を知っていますが、さまざまなファイル形式(.ods、.docx、.pdf ...)があります。そしてもちろん、私はそれが持っているsha1の合計を知っています。どうやって見つけるの?

これを約15個のファイルに対して行う必要があります。

2

検索+ grep

検索コマンドを使用

find /that/directory -type f -exec sha1sum {} \; | grep 'known sha1 sum'

これが機能する方法は次のとおりです。

  • find/that/directoryで再帰的に動作します
  • -type fを使用すると、通常のファイルのみを除外できます
  • exec sha1sum {} \;は、各ファイルを引数としてsha1sumコマンドを実行します(これは{}括弧が意味するものです)
  • grep 'known sha1sum'を使用すると、findコマンドの出力をフィルター処理して、必要なsha1ハッシュサムを含む出力行を取得できます。

バッシュのグロブスター

実行できるもう1つのことは、bashglobstarを使用して再帰的なグロビングを有効にし、そのように繰り返すことです。 sha1sumが既知のファイルを検索する方法は次のとおりです。

bash-4.3$ shopt -s globstar ;
bash-4.3$ known_sha1sum="4b1e65aab01f76b8863707eda5215af09633d275"
bash-4.3$ for f in ./**/* ; do [ -f "$f" ] && shasum=$(sha1sum "$f" | awk '{print $1}'); [ "$shasum" = "$known_sha1sum" ] && echo "$f"; done
./golang/hello_world

Forループで繰り返す代わりに、これをさらに短くすることができます。

bash-4.3$ shopt -s globstar
bash-4.3$ sha1sum ./**/* 2>/dev/null | grep '4b1e65aab01f76b8863707eda5215af09633d275'4b1e65aab01f76b8863707eda5215af09633d275  ./golang/hello_world

この方法は短いかもしれませんが、大量のファイルがあるディレクトリでは、この方法に懐疑的です。この場合、globはコマンドライン引数の最大量の範囲外に拡張される可能性があります。 注意事項

Python 3

もちろん、Python aficionadoであるため、このタスクにpythonスクリプトを提供せずに去ることはできません。このスクリプトは複数の引数を取ります。 sha1sumを見つける必要があることは、複数のファイルに対してこのタスクを実行するための質問の要件と一致しています。

スクリプトは、現在の作業ディレクトリからサブディレクトリまで検索することを前提としているため、最初にcdを目的の最上位ディレクトリに移動することを確認してください。

#!/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  )
             if path_sha1sum in sys.argv[1:]:
                 print(path_sha1sum,full_path)

def main():
    find_files('.')

if __== '__main__': main()

テスト走行:

$ ./find_with_sha1.py  '4b1e65aab01f76b8863707eda5215af09633d275' '38ab29bdda161da8082cbbc97d33747dff6fb848'      
4b1e65aab01f76b8863707eda5215af09633d275 ./golang/hello_world
38ab29bdda161da8082cbbc97d33747dff6fb848 ./golang/hello_world.go

このスクリプトは、個人用の GitHubリポジトリ でも利用できます。このスクリプトには、さらなる開発と変更が追加されます。

2

findsha1sumおよびgrep

find . -maxdepth 4 -type f | xargs -IF sha1sum "F" | grep 83976c8060222298565fd434c64ee09d19733559
1
Ravexina