Pull to refresh

Скрипт для рекурсивного сравнения директорий

Python *
В этом посте хочу поделиться с вами простым, но весьма полезным скриптом на питоне, который я написал для сравнения директорий тестового и рабочего проектов Django.


Проблема


На работе для решения внутренних задач я использую Django. Как результат — написан софт, с которым через браузер работает большая часть сотрудников — тех. поддержка, операторы, техническая служба нашей компании (сфера деятельности — телеком).

Довольно часто необходимо вносить изменения, но делать это сразу в рабочем проекте нельзя, т.к. простои вследствие возможных ошибок очень нежелательны. Поэтому была создана копия проекта, в который сначала и вносятся все изменения, а после тестирования измененные файлы копируются в рабочий проект.

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

Решение


Было решено написать скрипт, который сравнивает директории тестового и рабочего проектов и выводит на экран консоли список измененных или добавленных файлов. Например, у нас тестовая директория называется myproject, а рабочий проект находится в директории intranet. Запускаем наш скрипт и видим на экране:

/var/django_projects/myproject$ ./cmp.py

[*] /var/django_projects/myproject/templates/base.html
[-] /var/django_projects/myproject/templates/calls/call_add.html
[*] /var/django_projects/myproject/templates/calls/call_edit.html
[*] /var/django_projects/myproject/site_media/main.css


Измененные файлы — [*], новые (которых нет в рабочем проекте) — [-]. Очень удобно :)

Исходный код скрипта cmp.py

  1. #!/usr/bin/env python
  2. #------------------------------------------------------------
  3. # Compare directories 'myproject' and 'intranet' recursively
  4. #------------------------------------------------------------
  5.  
  6. import os, filecmp
  7.  
  8. # путь к тестовому проекту - с этой директории будем начинать обход
  9. dir_src = '/var/django_projects/myproject'
  10.  
  11. # будем сравнивать только файлы и директории из этого списка
  12. check_list = (
  13.   '/var/django_projects/myproject/apps/',
  14.   '/var/django_projects/myproject/templates/',
  15.   '/var/django_projects/myproject/scripts/',
  16.   '/var/django_projects/myproject/site_media/main.css',
  17. )
  18.  
  19. for root, dirs, files in os.walk(dir_src):
  20.   for name in files:
  21.     f_src = os.path.join(root, name)
  22.     need_check = f_src.startswith(check_list)
  23.     if need_check and not f_src.endswith('.pyc'):
  24.       f_dst = f_src.replace("myproject", "intranet")
  25.       if not os.path.exists(f_dst):
  26.         print "[-] ", f_src
  27.       elif not filecmp.cmp(f_src, f_dst):
  28.         print "[*] ", f_src


Как видно из кода, основную работу делает метод os.walk, а для проверки на существование и сравнения файлов используются соответственно os.path.exists и filecmp.cmp.

Вот и все, надеюсь, кому-нибудь пригодится :)

UPD: Прежде чем написать очередной комментарий о системах контроля версий, обратите, пожалуйста, внимание на название блога :) Тем не менее, спасибо всем тем, кто уже затронул эту тему, думаю, для полноты картины будет полезно.
Tags:
Hubs:
Total votes 29: ↑20 and ↓9 +11
Views 6.5K
Comments Comments 27