Automatyczny backup moich projektów do Google Drive - Python
Automatyczny backup moich projektów do Google Drive
Backup do chmury bez zmiany umiejscowienia folderu
Ostatnio spotkałem się z problemem. Dla mnie dużym. Miałem folder z moimi projektami. W sumie około 20 000 plików, prawie 400 MB danych. Folderu nie mogę przenieść w inne miejsce ze względu na powiązania z różnymi programami, więc zmiana lokalizacji nie wchodzi w grę. A żeby wykonać backup na dysk googla trzeba wrzucić pliki do folderu Google Drive.
Wężu ratuj
No i wpadłem na sposób. Jaki? Programistyczny :) A zrobię sobie skrypt. W pythonie - w końcu to kombajn do wszystkiego. Tak więc musi on kopiować wszystkie pliki z jednego miejsca w drugie. Nie może jednak ciągle kopiować tych plików i zamieniać. Bez sensu byłoby to. Niech kopiuje je i zamienia tylko w momencie kiedy zostały zmodyfikowane.
A więc krótkie podsumowanie:
- rób folder jeśli nie istnieje
- kopiuj nowe pliki
- kopiuj i zamieniaj zmodyfikowane pliki
Programowanie czas zacząć
Na początek weźmy wszystkie ścieżki katalogów z folderu, który chcemy skopiować i zróbmy te katalogi w miejscu docelowym jeśli nie istnieją. for src_dir in [x[0] for x in os.walk(src)]:
if "\\" in src_dir:
param, value = src_dir.split("\\",1)
dest_dir = dst + "\\" + value
else:
dest_dir = dst + "\\"
if not os.path.exists(dest_dir):
print "creating new folder " + dest_dir
os.makedirs(dest_dir)
Dobra. Wszystkie potrzebne foldery zrobione jeśli nie były.
Czas na wybranie wszystkich ścieżek plików.
result_src = [y for x in os.walk(src) for y in glob(os.path.join(x[0], '*'))]
A teraz jeśli jest to zmodyfikowany albo nowy plik to go kopiujemy. Reszty plików nie ruszamy, żeby nie kopiować bezsensownie istniejących już plików.
for src_file in result_src:
param, value = src_file.split("\\",1)
dest_file = dst + "\\" + value
if os.path.isfile(dest_file):
if os.stat(src_file).st_mtime - os.stat(dest_file).st_mtime > 1:
print "coping modified file " + src_file
shutil.copy2(src_file, dest_file)
else:
if os.path.isfile(src_file):
print "coping new file " + src_file
shutil.copyfile(src_file, dest_file)
No to mamy to wszystko. W przypadku sprawdzania czy plik został zmodyfikowany, biorę ostatni czas edycji w sekundach i jeśli czas zmiany jest większy niż jedna sekunda to znaczy, że trzeba skopiować go. Skrypt wrzuciłem sobie na pulpit i mam tam folder Projects i Google Drive. Podałem po prostu ich ścieżki i wszystko ładnie działa.