{"id":18879793,"url":"https://github.com/gusenov/diff-dir-py","last_synced_at":"2026-02-20T04:30:19.712Z","repository":{"id":62568168,"uuid":"100501205","full_name":"gusenov/diff-dir-py","owner":"gusenov","description":"Скрипт на Питоне для рекурсивного сравнения содержимого двух папок.","archived":false,"fork":false,"pushed_at":"2017-08-20T13:16:22.000Z","size":25,"stargazers_count":1,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-01T12:48:29.257Z","etag":null,"topics":["compare-data","compare-files","pypi","python","python-package","python-script","testpypi"],"latest_commit_sha":null,"homepage":"https://pypi.python.org/pypi/diff-dir-py","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gusenov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-08-16T14:57:28.000Z","updated_at":"2021-06-09T08:08:52.000Z","dependencies_parsed_at":"2022-11-03T17:00:48.542Z","dependency_job_id":null,"html_url":"https://github.com/gusenov/diff-dir-py","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gusenov%2Fdiff-dir-py","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gusenov%2Fdiff-dir-py/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gusenov%2Fdiff-dir-py/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gusenov%2Fdiff-dir-py/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gusenov","download_url":"https://codeload.github.com/gusenov/diff-dir-py/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239841742,"owners_count":19705981,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["compare-data","compare-files","pypi","python","python-package","python-script","testpypi"],"created_at":"2024-11-08T06:39:27.077Z","updated_at":"2026-02-20T04:30:19.682Z","avatar_url":"https://github.com/gusenov.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Общие сведения\n\n*diff-dir.py* - это скрипт на Питоне для рекурсивного сравнения содержимого двух папок.\n\nСкрипт рекурсивно поимённо сравнивает файлы из копии с файлами из оригинала.\nСравнение на идентичность проводится путем расчёта и сверки MD5-хешей от файлов.\nТакже можно включить построчное сравнение файлов.\n\n## Входные данные\n\nСкрипт принимает на входе пути к двум папкам: оригиналу и копии.\n\nПуть к оригиналу указывается через длинную опцию **--odir** (в коротком варианте **-o**).\n\nПуть к копии указывается через длинную опцию **--cdir** (в коротком варианте **-с**).\n\n## Выходные данные\n\nВ вывод всегда попадают:\n- файлы из копии, которые не идентичны по содержимому соответствующим файлам в оригинале;\n- файлы из копии, которые отсутствуют в оригинале.\n\nВ вывод никогда не попадают:\n- файлы из оригинала, которые отсутствуют в копии.\n\nФормат вывода:\n\n```text\n* относительный/путь/к/файлу\n- относительный/путь/к/файлу\n```\n\nОбозначения:\n\n- звёздочка обозначает, что файл из копии не идентичен по содержимому соответствующему файлу в оригинале;\n- минус обозначает, что файл из копии отсутствуют в оригинале.\n\n## Переводы строк\n\nВ некоторых случаях файлы являются идентичными за исключением способа [перевода строки](https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8).\nЕсли сравнивать такие файлы через их MD5-хеши, то они будут считаться различными.\n\n```bash\n$ python diff-dir.py --odir tests/line-endings/lf/ --cdir tests/line-endings/cr+lf/\n* _languages.js\n```\n\nПоэтому у скрипта есть длинная опция **--line-by-line** (в коротком варианте **-l**), которая включает дополнительное сравнение файлов по строкам.\nПри использовании этой опции, если у файлов различные MD5-хеши, но при построковом сравнении они равны, то эти файлы будут считаться идентичными.\n\n```bash\n$ python diff-dir.py -o tests/line-endings/lf/ -c tests/line-endings/cr+lf/ -l\n```\n\nДля того чтобы избежать построчного сравнения бинарных файлов в константе [BINARY](https://github.com/gusenov/diff-dir-py/blob/master/diff-dir.py#L10) перечислены расширения для которых не нужно проводить построчное сравнение.\n\n## Примеры использования скрипта diff-dir.py в качестве инструмента\n\n1. Вывод справки по коротким опциям:\n\n```bash\n$ python diff-dir.py -h\ndiff-dir.py -o \u003corigindir\u003e -c \u003cclonedir\u003e -l\n```\n\n2. Вывод справки по длинным опциям:\n\n```bash\n$ python diff-dir.py --help\ndiff-dir.py --odir \u003corigindir\u003e --cdir \u003cclonedir\u003e --line-by-line\n```\n\n3. Использование длинных опций:\n\n```bash\n$ python diff-dir.py --odir /o/ri/gin/al/ --cdir /c/lo/ne/ --line-by-line\n```\n\n4. Использование коротких опций:\n\n```bash\n$ python diff-dir.py -o /or/igi/na/l/ -c /cl/on/e/ -l\n```\n\n## Пакет [diff-dir-py](https://pypi.python.org/pypi/diff-dir-py) в [Python Package Index](https://pypi.python.org/pypi)\n\nУстановка пакета в *~/.local/lib/python3.5/site-packages/*:\n\n```bash\n$ pip install diff-dir-py --user\n```\n\nИспользование пакета в своём коде:\n\nФункция *diffdir.cmp* является генератором кортежей из двух элементов: (путь к файлу, статус по нему).\n\n```python\nimport diffdir\n\norigin = \"/o/ri/gin/al/\"\nclone = \"/c/lo/ne/\"\n\ndifference = diffdir.cmp(origin, clone, True)\n\nfor path, status in difference:\n    print(\"{} {}\".format(status, path))\n```\n\nРезультат исполнения вышеприведённого кода:\n\n```text\n* относительный/путь/к/файлу\n- относительный/путь/к/файлу\n```\n\nУдаление пакета:\n\n```bash\n$ pip uninstall diff-dir-py\n```\n\n## Исходный код проекта\n\n- [Как считываются аргументы командной строки](https://github.com/gusenov/diff-dir-py/blob/master/diffdir/diff-dir.py#L75)\n- [Как рассчитывается MD5-хеш от файла](https://github.com/gusenov/diff-dir-py/blob/master/diffdir/diff-dir.py#L44)\n- [Как файлы сравниваются построчно](https://github.com/gusenov/diff-dir-py/blob/master/diffdir/diff-dir.py#L52)\n- [Как импортируется модуль в названии, которого есть минус](https://github.com/gusenov/diff-dir-py/blob/master/diffdir/__init__.py#L1)\n\n## Информация, использованная при реализации\n\nСтандартная библиотека:\n\n- [tutorialspoint.com/python/python_command_line_arguments.htm](https://www.tutorialspoint.com/python/python_command_line_arguments.htm)\n- [tutorialspoint.com/python/os_walk.htm](https://www.tutorialspoint.com/python/os_walk.htm)\n- [pyformat.info/#simple](https://pyformat.info/#simple)\n\nЮникод:\n\n- [stackoverflow.com/questions/10589620/syntaxerror-non-ascii-character-xa3-in-file-when-function-returns-£](https://stackoverflow.com/questions/10589620/syntaxerror-non-ascii-character-xa3-in-file-when-function-returns-%C2%A3)\n\nПереводы строк:\n\n- [stackoverflow.com/questions/12330522/reading-a-file-without-newlines](https://stackoverflow.com/questions/12330522/reading-a-file-without-newlines)\n- [stackoverflow.com/questions/3860519/see-line-breaks-and-carriage-returns-in-editor](https://stackoverflow.com/questions/3860519/see-line-breaks-and-carriage-returns-in-editor)\n\nИмпорт модулей:\n\n- [stackoverflow.com/questions/761519/is-it-ok-to-use-dashes-in-python-files-when-trying-to-import-them](https://stackoverflow.com/questions/761519/is-it-ok-to-use-dashes-in-python-files-when-trying-to-import-them)\n- [stackoverflow.com/questions/8350853/how-to-import-module-when-module-name-has-a-dash-or-hyphen-in-it](https://stackoverflow.com/questions/8350853/how-to-import-module-when-module-name-has-a-dash-or-hyphen-in-it)\n- [stackoverflow.com/questions/8790003/dynamically-import-a-method-in-a-file-from-a-string](https://stackoverflow.com/questions/8790003/dynamically-import-a-method-in-a-file-from-a-string)\n- [ru.stackoverflow.com/questions/420987/Обращение-к-функции-заданной-в-init-py](https://ru.stackoverflow.com/questions/420987/%D0%9E%D0%B1%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8-%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%BD%D0%BE%D0%B9-%D0%B2-init-py)\n- [ibm.com/developerworks/ru/library/l-python_part_5/index.html](https://www.ibm.com/developerworks/ru/library/l-python_part_5/index.html)\n- [pep8.ru/doc/tutorial-3.1/6.html](http://pep8.ru/doc/tutorial-3.1/6.html)\n- [stackoverflow.com/questions/36515197/python-import-module-from-a-package](https://stackoverflow.com/questions/36515197/python-import-module-from-a-package)\n\nКаталог пакетов [Python Package Index](https://pypi.python.org/pypi):\n\n- [peterdowns.com/posts/first-time-with-pypi.html](http://peterdowns.com/posts/first-time-with-pypi.html)\n- [docs.python.org/3.7/distutils/packageindex.html](https://docs.python.org/3.7/distutils/packageindex.html)\n- [packaging.python.org/tutorials/distributing-packages](https://packaging.python.org/tutorials/distributing-packages)\n- [pypi.python.org/pypi?:action=list_classifiers](https://pypi.python.org/pypi?%3Aaction=list_classifiers)\n- [packaging.python.org/guides/using-testpypi](https://packaging.python.org/guides/using-testpypi)\n\nСистема управления пакетами pip:\n\n- [stackoverflow.com/questions/34514703/pip-install-from-pypi-works-but-from-testpypi-fails-cannot-find-requirements](https://stackoverflow.com/questions/34514703/pip-install-from-pypi-works-but-from-testpypi-fails-cannot-find-requirements)\n- [pip.pypa.io/en/stable/reference/pip_uninstall](https://pip.pypa.io/en/stable/reference/pip_uninstall)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgusenov%2Fdiff-dir-py","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgusenov%2Fdiff-dir-py","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgusenov%2Fdiff-dir-py/lists"}