This is my first attempt in response to a question posed in one of StackExchange sites for Unix/Linux – How do you compare two folders and copy the difference to a third folder?. The scripts compares the latest directory, given as argument one, to an old directory, argument two, and creates a difference directory if it doesn’t exist, third argument, and copies the files and directories which exist only in latest directory into the difference directory. It also copies files which are different in latest directory as compared to the old one, to the difference directory. Make sure to put the arguments in the right order – latest directory first, old directory next, and the difference directory last.
Sample usage:
daniel@linubuvma:~/scripts/python$ python copy_difference.py /tmp/test/current /tmp/test/old /tmp/test/difference
(Silent output is good).
daniel@linubuvma:~/practice/python$ ls -1R /tmp/test/current/ /tmp/test/current/: dirc extra newone one three two /tmp/test/current/dirc: /tmp/test/current/extra: extra2 fourth /tmp/test/current/extra/extra2: /tmp/test/current/newone: file2 fileone daniel@linubuvma:~/practice/python$ ls -1R /tmp/test/old /tmp/test/old: extra newone one two /tmp/test/old/extra: /tmp/test/old/newone: file2 daniel@linubuvma:~/practice/python$ ls -1R /tmp/test/difference ls: cannot access /tmp/test/difference: No such file or directory daniel@linubuvma:~/practice/python$ python copy_difference.py /tmp/test/current /tmp/test/old /tmp/test/difference daniel@linubuvma:~/practice/python$ ls -1R /tmp/test/difference /tmp/test/difference: extra newone three two /tmp/test/difference/extra: fourth /tmp/test/difference/newone: fileone
Here is the Python script.
#!/usr/bin/env python import os, sys import filecmp import re import shutil holderlist=[] def compareme(dir1, dir2): dircomp=filecmp.dircmp(dir1,dir2) only_in_one=dircomp.left_only diff_in_one=dircomp.diff_files dirpath=os.path.abspath(dir1) [holderlist.append(os.path.abspath( os.path.join(dir1,x) )) for x in only_in_one] [holderlist.append(os.path.abspath( os.path.join(dir1,x) )) for x in diff_in_one] if len(dircomp.common_dirs) > 0: for item in dircomp.common_dirs: compareme(os.path.abspath(os.path.join(dir1,item)), os.path.abspath(os.path.join(dir2,item))) return holderlist def main(): if len(sys.argv) > 3: dir1=sys.argv[1] dir2=sys.argv[2] dir3=sys.argv[3] else: print "Usage: ", sys.argv[0], "currentdir olddir difference" sys.exit(1) if not dir3.endswith('/'): dir3=dir3+'/' source_files=compareme(dir1,dir2) dir1=os.path.abspath(dir1) dir3=os.path.abspath(dir3) destination_files=[] new_dirs_create=[] for item in source_files: destination_files.append(re.sub(dir1, dir3, item) ) for item in destination_files: new_dirs_create.append(os.path.split(item)[0]) for mydir in set(new_dirs_create): if not os.path.exists(mydir): os.makedirs(mydir) #copy pair copy_pair=zip(source_files,destination_files) for item in copy_pair: if os.path.isfile(item[0]): shutil.copyfile(item[0], item[1]) if __name__ == '__main__': main()