Сравните один каталог за раз 1 с тем же каталогом за время 2 - PullRequest
0 голосов
/ 22 января 2020

Моя цель: сравнить содержимое одного каталога (включая подкаталоги и файлы) в момент времени 1 с содержимым того же каталога в момент времени 2 (например, через 6 месяцев). «Содержимое» означает: количество и имена подкаталогов + количество и имена и размер файлов. Основной предполагаемый результат: быть уверенным, что за это время файлы не были уничтожены или повреждены. Я не нашел ни одного существующего инструмента, хотя мне было интересно, могут ли помочь https://github.com/njanakiev/folderstats folderstats . Не могли бы вы предложить какие-нибудь модули или что-нибудь, чтобы начать хорошо? Если бы вы услышали о существующем инструменте для этого, мне тоже было бы интересно. Спасибо.

1 Ответ

0 голосов
/ 23 января 2020

Вот код, который должен помочь вам начать работу. Он определяет функцию, которая будет создавать структуру данных из вложенных словарей, которые соответствуют содержимому начального каталога root и всего, что находится под ним в файловой системе. Каждый словарь каждого элемента, имеющий ключ 'type' со значением 'file', также будет иметь ключ 'stat', который может содержать любые метаданные файла, которые вы хотите или нуждаетесь, такие как время создания, время последнего изменения, длина в bytes,… et c.

Вы можете использовать его, чтобы получить снимки «до» и «после» отслеживаемого каталога и использовать их для сравнения. Я упустил последнее (сравнение), поскольку не уверен, что именно вас интересует.

Обратите внимание, что когда я действительно приступил к реализации этого, я обнаружил, что проще написать рекурсивную функцию чем использовать os.walk(), как я предложил в комментарии.

Следующее реализует версию функции и распечатывает структуру данных вложенных словарей, которые она возвращает.

import os
from pathlib import PurePath


def path_to_dict(path):
    result = {}
    result['full_path'] = PurePath(path).as_posix()
    if os.path.isdir(path):
        result['type'] = 'dir'
        result['items'] = {filename: path_to_dict(os.path.join(path, filename))
                               for filename in os.listdir(path)}
    else:
        result['type'] = 'file'
        result['stat'] = 'os.stat(path)'  # Preserve any needed metadata.
    return result


root = './folder'  # Change as desired.
before = path_to_dict(root)

# Pretty-print data structure created.
from pprint import pprint
pprint(before, sort_dicts=False)
...