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

Не используйте базовый класс, если Вы не знаете то, что это означает, и что это применяется в этом случае. Если это применяется, используйте его, иначе, интерфейсы использования. Но отметьте ответ о маленьких интерфейсах.

Общедоступное Наследование злоупотребляется в OOD и выражает намного больше, чем большинство разработчиков понимает или готово соответствовать. Посмотрите Принцип Liskov Substitutablity

Короче говоря, если "" B тогда A, требует не больше, чем B и поставляет не меньше, чем B, для каждого метода, который он представляет.

2
задан 17.05.2020, 20:30

2 ответа

Сценарий Python с hashlib и os.walk

Кроме использования find и globstar, Python имеет модули для hashsum вычисления и рекурсивного обхода через дерево каталогов. Таким образом можно записать простой сценарий, столь же представленный ниже. На самом деле этот сценарий является в значительной степени тем же как, что я использовал для этот ответ с незначительными различиями.

Этот сценарий предполагает, что Вы хотите рекурсивно идти через текущий рабочий каталог, поэтому удостоверьтесь Вы 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
0
ответ дан 17.05.2020, 20:31

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

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

shopt -s globstar dotglob
sha1sum **

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

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

0
ответ дан 17.05.2020, 20:31
  • 1
    Сокращение ARG_MAX, размер command' s аргументы, можно получить значение для системы с getconf ARG_MAX. – Ifaruki 17.05.2020, 20:32

Теги

Похожие вопросы