-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
sync.py
57 lines (48 loc) · 1.94 KB
/
sync.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import sys
import os
import filecmp
import shutil
import argparse
def sync_folders(source_folder, target_folder):
dcmp = filecmp.dircmp(source_folder, target_folder)
# Copy files from the source folder to the target folder
for name in dcmp.left_only:
source_path = os.path.join(source_folder, name)
target_path = os.path.join(target_folder, name)
if os.path.isfile(source_path):
shutil.copy2(source_path, target_path)
else:
shutil.copytree(source_path, target_path)
print(f"Copying: {source_path} -> {target_path}")
# Remove files that are missing in the source folder
for name in dcmp.right_only:
target_path = os.path.join(target_folder, name)
if os.path.isfile(target_path):
os.remove(target_path)
print(f"Removing: {target_path}")
else:
shutil.rmtree(target_path)
print(f"Removing: {target_path}")
# Recursively synchronize subfolders
for sub_dcmp in dcmp.subdirs.values():
sync_folders(
os.path.join(source_folder, sub_dcmp.dirname),
os.path.join(target_folder, sub_dcmp.dirname)
)
# Create the argument parser
parser = argparse.ArgumentParser(description="Script to synchronize two folders.")
parser.add_argument("-s", "--source", type=str, help="Path to the source folder.")
parser.add_argument("-d", "--destination", type=str, help="Path to the target folder.")
# Parse the command-line arguments
args = parser.parse_args()
# Check for required arguments
if not args.source or not args.destination:
parser.print_help()
else:
source_folder = args.source
target_folder = args.destination
# Check if the target folder exists and create it if it doesn't
if not os.path.exists(target_folder):
os.makedirs(target_folder)
print(f"Created target folder: {target_folder}")
sync_folders(source_folder, target_folder)