Рекурсивная контрольная сумма

Я использовал следующую командную строку для рекурсивного контрольного суммирования каталогов. Кажется, что работа сделана, но все же, будучи новичком, мне было интересно, есть ли потенциальные проблемы с этим? Может ли эта команда пропустить файлы или иным образом испортить?

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

2 ответа

Решение

В вашем подходе нет ничего плохого. Вы исключаете каталоги, и поиск по умолчанию будет включать скрытые файлы. Да, все в порядке.

Но я предложу вам альтернативу, потому что это то, что я делаю:

shopt -s globstar dotglob
sha1sum **

globstar позволяет рекурсивное сопоставление для ** а также dotglob позволяет сопоставлять скрытые файлы. Между ними они расширяются до всех имен файлов, и sha1sum может анализировать их все.

Основная проблема с этим подходом состоит в том, что он передаст все имена файлов sha1sum в одну жирную кучу. Хотя это может быть несколько быстрее при небольших нагрузках, оно взорвется, если у вас слишком много имен файлов. Я не знаю, что такое отсечение.

Скрипт Python с hashlib и os.walk

Помимо использования find а также globstarВ 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 __name__ == '__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
Другие вопросы по тегам