That's what I wanted to do. So, I wrote my first Python (3) script. Don't hesitate to use or modified this code. It can synchronized two folders in two-way directions. It never deletes files or folders in its strategy. It only replicates older or missing files and folders from the two folders to synchronized.
Enjoy!
PS : Be cool with me, this is my first steps with Python
__author__ = 'Alexandre de Pellegrin'
import os
import shutil
srcDir = '/home/user/folder1'
dstDir = '/home/user/folder2'
def main():
try:
print("Begin sync")
checkIfRootDirsExist(srcDir, dstDir)
syncDirs(srcDir, dstDir)
syncFiles(srcDir, dstDir)
print("End sync with success")
except Exception as e:
print(e)
print("End sync with failure!")
def checkIfRootDirsExist(rootDir1, rootDir2) :
if (not os.path.exists(rootDir1) and not os.path.isdir(rootDir1)) :
raise Exception(rootDir1 + " doesn't exist")
if (not os.path.exists(rootDir2) and not os.path.isdir(rootDir2)) :
raise Exception(rootDir2 + " doesn't exist")
def syncDirs(rootDir1, rootDir2):
for root1, dirs1, files1 in os.walk(rootDir1):
for relativePath1 in dirs1 :
fullPath1 = os.path.join(root1, relativePath1)
fullPath2 = fullPath1.replace(rootDir1, rootDir2)
if os.path.exists(fullPath2) and os.path.isdir(fullPath2) :
continue
if os.path.exists(fullPath2) and os.path.isfile(fullPath2) :
raise Exception("Cannot perform dir sync." + str(fullPath2) + " should be a dir, not a file!")
# Case 1 : dest dir does not exit
shutil.copytree(fullPath1, fullPath2)
print("Directory " + str(fullPath2) + " copied from " + str(fullPath1))
continue
for root2, dirs2, files2 in os.walk(rootDir2):
for relativePath2 in dirs2:
fullPath2 = os.path.join(root2, relativePath2)
fullPath1 = fullPath2.replace(rootDir2, rootDir1)
if os.path.exists(fullPath1) and os.path.isdir(fullPath1) :
continue
if os.path.exists(fullPath1) and os.path.isfile(fullPath1) :
raise Exception("Cannot perform dir sync." + str(fullPath1) + " should be a dir, not a file!")
# Case 3 : dest dir exists but not src dir, so we need to copy it
shutil.copytree(fullPath2, fullPath1)
print("Directory " + str(fullPath1) + " copied from" + str(fullPath2))
continue
def syncFiles(rootDir1, rootDir2):
for root1, dirs1, files1 in os.walk(rootDir1):
for file1 in files1:
fullPath1 = os.path.join(root1, file1)
fullPath2 = fullPath1.replace(rootDir1, rootDir2)
# Case 1 : the file does not exist in dest dir
if (not os.path.exists(fullPath2)) :
shutil.copy2(fullPath1, fullPath2)
print("File " + str(fullPath2) + " copied from " + str(fullPath1))
continue
# Case 2 : src file is more recent than dest file
file1LastModificationTime = round(os.path.getmtime(fullPath1))
file2LastModificationTime = round(os.path.getmtime(fullPath2))
if (file1LastModificationTime > file2LastModificationTime):
os.remove(fullPath2)
shutil.copy2(fullPath1, fullPath2)
print("File " + str(fullPath2) + " synchronized from " + str(fullPath1))
continue
# Case 3 : dest file is more recent than src file
if (file1LastModificationTime < file2LastModificationTime):
os.remove(fullPath1)
shutil.copy2(fullPath2, fullPath1)
print("File " + str(fullPath1) + " synchronized from " + str(fullPath2))
continue
# Case 4 : file only exists in dest dir but not in src
# So, we copy it back to src dir
for root2, dirs2, files2 in os.walk(rootDir2):
for file2 in files2:
fullPath2 = os.path.join(root2, file2);
fullPath1 = fullPath2.replace(rootDir2, rootDir1);
if (os.path.exists(fullPath1)):
continue
shutil.copy2(fullPath2, fullPath1)
print("File " + str(fullPath1) + " copied from " + str(fullPath2))
if __name__ == '__main__':
main()
Enjoy!
PS : Be cool with me, this is my first steps with Python
__author__ = 'Alexandre de Pellegrin'
import os
import shutil
srcDir = '/home/user/folder1'
dstDir = '/home/user/folder2'
def main():
try:
print("Begin sync")
checkIfRootDirsExist(srcDir, dstDir)
syncDirs(srcDir, dstDir)
syncFiles(srcDir, dstDir)
print("End sync with success")
except Exception as e:
print(e)
print("End sync with failure!")
def checkIfRootDirsExist(rootDir1, rootDir2) :
if (not os.path.exists(rootDir1) and not os.path.isdir(rootDir1)) :
raise Exception(rootDir1 + " doesn't exist")
if (not os.path.exists(rootDir2) and not os.path.isdir(rootDir2)) :
raise Exception(rootDir2 + " doesn't exist")
def syncDirs(rootDir1, rootDir2):
for root1, dirs1, files1 in os.walk(rootDir1):
for relativePath1 in dirs1 :
fullPath1 = os.path.join(root1, relativePath1)
fullPath2 = fullPath1.replace(rootDir1, rootDir2)
if os.path.exists(fullPath2) and os.path.isdir(fullPath2) :
continue
if os.path.exists(fullPath2) and os.path.isfile(fullPath2) :
raise Exception("Cannot perform dir sync." + str(fullPath2) + " should be a dir, not a file!")
# Case 1 : dest dir does not exit
shutil.copytree(fullPath1, fullPath2)
print("Directory " + str(fullPath2) + " copied from " + str(fullPath1))
continue
for root2, dirs2, files2 in os.walk(rootDir2):
for relativePath2 in dirs2:
fullPath2 = os.path.join(root2, relativePath2)
fullPath1 = fullPath2.replace(rootDir2, rootDir1)
if os.path.exists(fullPath1) and os.path.isdir(fullPath1) :
continue
if os.path.exists(fullPath1) and os.path.isfile(fullPath1) :
raise Exception("Cannot perform dir sync." + str(fullPath1) + " should be a dir, not a file!")
# Case 3 : dest dir exists but not src dir, so we need to copy it
shutil.copytree(fullPath2, fullPath1)
print("Directory " + str(fullPath1) + " copied from" + str(fullPath2))
continue
def syncFiles(rootDir1, rootDir2):
for root1, dirs1, files1 in os.walk(rootDir1):
for file1 in files1:
fullPath1 = os.path.join(root1, file1)
fullPath2 = fullPath1.replace(rootDir1, rootDir2)
# Case 1 : the file does not exist in dest dir
if (not os.path.exists(fullPath2)) :
shutil.copy2(fullPath1, fullPath2)
print("File " + str(fullPath2) + " copied from " + str(fullPath1))
continue
# Case 2 : src file is more recent than dest file
file1LastModificationTime = round(os.path.getmtime(fullPath1))
file2LastModificationTime = round(os.path.getmtime(fullPath2))
if (file1LastModificationTime > file2LastModificationTime):
os.remove(fullPath2)
shutil.copy2(fullPath1, fullPath2)
print("File " + str(fullPath2) + " synchronized from " + str(fullPath1))
continue
# Case 3 : dest file is more recent than src file
if (file1LastModificationTime < file2LastModificationTime):
os.remove(fullPath1)
shutil.copy2(fullPath2, fullPath1)
print("File " + str(fullPath1) + " synchronized from " + str(fullPath2))
continue
# Case 4 : file only exists in dest dir but not in src
# So, we copy it back to src dir
for root2, dirs2, files2 in os.walk(rootDir2):
for file2 in files2:
fullPath2 = os.path.join(root2, file2);
fullPath1 = fullPath2.replace(rootDir2, rootDir1);
if (os.path.exists(fullPath1)):
continue
shutil.copy2(fullPath2, fullPath1)
print("File " + str(fullPath1) + " copied from " + str(fullPath2))
if __name__ == '__main__':
main()