2010-10-03 4 views
2

Я собираюсь реализовать рекурсивное сопоставление папок на python. Как вы считаете, лучший алгоритм для этого?Сравнение папок рекурсивно с использованием python

  1. Получить два списка файлов для папок
  2. Сортировать оба списка
  3. Сравнить с помощью модуля filecmp для файла
  4. Повторите для каждой папки рекурсивно

В результате мне нужно получите только список файлов, которые отличаются (разница в содержимом здесь не нужна), список файлов, которые отсутствуют в одной из сопоставимых папок.

спасибо.

ответ

1

Если бы я был вами, я бы проверял, не выполняет ли другая программа эту функцию, например rsync или diff. Для того, что я вижу, у обоих есть необходимые функции. Более подробная информация об этом here.

Если вам действительно нужно сделать это в Python, я бы изменить немного свой алгоритм, делая его похожим на это:

  1. магазин оба пути содержания в двух отдельных списков переменных, используя os.walk;
  2. Итерации по каждому значению первого списка, чтобы найти соответствующее значение во втором списке;
  3. Если соответствующее значение найдено, сравните его с помощью модуля filecmp. В противном случае отобразите отсутствующий файл;
  4. Удалить значение из второго списка;
  5. Перейдите к № 2 до тех пор, пока первый список не будет пуст;
  6. Распечатать все оставлено во втором списке;
+0

Похоже, что вы получите некоторую скорость, используя наборы вместо списков. – intuited

+0

А если бы у меня был новый файл во втором списке, но который отсутствует в первом списке? В соответствии с этими шагами у меня будет тот же список файлов, которые первоначально были только в первом списке. Возможно, вы можете написать здесь пример кода в соответствии с указанным вами шагом? – yart

2

Сделать рекурсивный поиск по каталогу и для каждого хранилища файлов md5 или sha контрольной суммы файла в словаре в качестве ключа и пути/имени в качестве значения. Сделайте этот словарь для обоих каталогов. Затем вы можете удалить пары из каждого каталога, и результат отсутствует/разные файлы.

Это сделает простой O (n) algorhitm, где n - это объем каталога.

Смежные вопросы