diff-dir.py - это скрипт на Питоне для рекурсивного сравнения содержимого двух папок.
Скрипт рекурсивно поимённо сравнивает файлы из копии с файлами из оригинала. Сравнение на идентичность проводится путем расчёта и сверки MD5-хешей от файлов. Также можно включить построчное сравнение файлов.
Скрипт принимает на входе пути к двум папкам: оригиналу и копии.
Путь к оригиналу указывается через длинную опцию --odir (в коротком варианте -o).
Путь к копии указывается через длинную опцию --cdir (в коротком варианте -с).
В вывод всегда попадают:
- файлы из копии, которые не идентичны по содержимому соответствующим файлам в оригинале;
- файлы из копии, которые отсутствуют в оригинале.
В вывод никогда не попадают:
- файлы из оригинала, которые отсутствуют в копии.
Формат вывода:
* относительный/путь/к/файлу
- относительный/путь/к/файлу
Обозначения:
- звёздочка обозначает, что файл из копии не идентичен по содержимому соответствующему файлу в оригинале;
- минус обозначает, что файл из копии отсутствуют в оригинале.
В некоторых случаях файлы являются идентичными за исключением способа перевода строки. Если сравнивать такие файлы через их MD5-хеши, то они будут считаться различными.
$ python diff-dir.py --odir tests/line-endings/lf/ --cdir tests/line-endings/cr+lf/
* _languages.js
Поэтому у скрипта есть длинная опция --line-by-line (в коротком варианте -l), которая включает дополнительное сравнение файлов по строкам. При использовании этой опции, если у файлов различные MD5-хеши, но при построковом сравнении они равны, то эти файлы будут считаться идентичными.
$ python diff-dir.py -o tests/line-endings/lf/ -c tests/line-endings/cr+lf/ -l
Для того чтобы избежать построчного сравнения бинарных файлов в константе BINARY перечислены расширения для которых не нужно проводить построчное сравнение.
- Вывод справки по коротким опциям:
$ python diff-dir.py -h
diff-dir.py -o <origindir> -c <clonedir> -l
- Вывод справки по длинным опциям:
$ python diff-dir.py --help
diff-dir.py --odir <origindir> --cdir <clonedir> --line-by-line
- Использование длинных опций:
$ python diff-dir.py --odir /o/ri/gin/al/ --cdir /c/lo/ne/ --line-by-line
- Использование коротких опций:
$ python diff-dir.py -o /or/igi/na/l/ -c /cl/on/e/ -l
Пакет diff-dir-py в Python Package Index
Установка пакета в ~/.local/lib/python3.5/site-packages/:
$ pip install diff-dir-py --user
Использование пакета в своём коде:
Функция diffdir.cmp является генератором кортежей из двух элементов: (путь к файлу, статус по нему).
import diffdir
origin = "/o/ri/gin/al/"
clone = "/c/lo/ne/"
difference = diffdir.cmp(origin, clone, True)
for path, status in difference:
print("{} {}".format(status, path))
Результат исполнения вышеприведённого кода:
* относительный/путь/к/файлу
- относительный/путь/к/файлу
Удаление пакета:
$ pip uninstall diff-dir-py
- Как считываются аргументы командной строки
- Как рассчитывается MD5-хеш от файла
- Как файлы сравниваются построчно
- Как импортируется модуль в названии, которого есть минус
Стандартная библиотека:
- tutorialspoint.com/python/python_command_line_arguments.htm
- tutorialspoint.com/python/os_walk.htm
- pyformat.info/#simple
Юникод:
Переводы строк:
- stackoverflow.com/questions/12330522/reading-a-file-without-newlines
- stackoverflow.com/questions/3860519/see-line-breaks-and-carriage-returns-in-editor
Импорт модулей:
- stackoverflow.com/questions/761519/is-it-ok-to-use-dashes-in-python-files-when-trying-to-import-them
- stackoverflow.com/questions/8350853/how-to-import-module-when-module-name-has-a-dash-or-hyphen-in-it
- stackoverflow.com/questions/8790003/dynamically-import-a-method-in-a-file-from-a-string
- ru.stackoverflow.com/questions/420987/Обращение-к-функции-заданной-в-init-py
- ibm.com/developerworks/ru/library/l-python_part_5/index.html
- pep8.ru/doc/tutorial-3.1/6.html
- stackoverflow.com/questions/36515197/python-import-module-from-a-package
Каталог пакетов Python Package Index:
- peterdowns.com/posts/first-time-with-pypi.html
- docs.python.org/3.7/distutils/packageindex.html
- packaging.python.org/tutorials/distributing-packages
- pypi.python.org/pypi?:action=list_classifiers
- packaging.python.org/guides/using-testpypi
Система управления пакетами pip: