# The script merges the regular files in directory1 and directory2 into destdir (exclude subdirectories). done # Files that are in only one of the directories may be copied directly. done # However, if the file is in both directories, copy the newer file. done # Make sure the source directories exists. done # Create the destination directory if it does not exist. done # Print out a "Usage" message if the user did not provide 3 arguments. done # Syntax: merge.sh directory1 directory2 destdir #!/bin/sh dir1=$1; dir2=$2; desdir=$3; # Usage [ $# -ne 3 ] && { echo "Usage: merge.sh requires 3 directory parameters.\nSyntax: merge.sh directory1 directory2 destdir\nmerge.sh takes all regular files from two directories and copies them into one destination directory.\nIf each directory has the same file, the newer one is copied over."; exit 1; } # make sure Dir 1 ad Dir 2 exist exs=0 # 0 = both present | 1 = dir 1 missing | 2 = dir 2 missing | 3 = both dir 1 and dir 2 missing [ ! -d $dir1 ] && exs=`expr $exs + 1` [ ! -d $dir2 ] && exs=`expr $exs + 2` [ $exs -eq 1 ] && { echo "Directory one cannot be found"; exit 1; } [ $exs -eq 2 ] && { echo "Directory two cannot be found"; exit 1; } [ $exs -eq 3 ] && { echo "Directory one and directory two cannot be found"; exit 1; } # make the destdir if it does not exist # Check if a file with this name exists # if so: # check if it is a directory # if so: # continue # if not: # error, we would overwrite another file with that name # if not: # create this directory if [ -e $desdir ]; then if [ ! -d $desdir ]; then echo "Your specified destination directory exists as a file that is not a directory.\nThis program will not overwrite this file.\nProgram end." exit 1 fi else mkdir $desdir fi # Loop through Directory 1 # check if current file is a FILE # if so: # check for existance of file in Directory 2 # if exists: # compare last modified time of each file # copy file into the Destination Directy which has the latest modification # if no exist: # copy file directly # if not: # ignore file for d1file in $dir1/*; # $d1file is like: dir1/file do curFile=`basename $d1file` if [ -f "$d1file" ]; then if [ -f "$dir2/$curFile" ]; then if [ "$d1file" -nt "$dir2/$curFile" ]; then cp "$d1file" "$desdir" else cp "$dir2/$curFile" "$desdir" fi else cp "$d1file" "$desdir" fi fi done # at this point we have taken all unique files from directory one and moved them into the destination directory. # files which were in both, have been moved from either directory 1 or directory 2 depending on which one is newer # directory 2 still has files which are unique to it, and they must be moved # Loop through Directoy 2 # check if current file is a FILE # if so: # Check if file has been moved into Destination Directory already (from Dir 1 loop) # if so: # ignore file # if not: # copy file into Destination Directory # if not: # ignore file for d2file in $dir2/*; do curFile=`basename $d2file` if [ -f "$d2file" ]; then if [ ! -e "$desdir/$curFile" ]; then cp "$d2file" "$desdir" fi fi done # at this point all files which were also in Dir 1 and were newest were copied by Loop 1 # unique files in Dir 2 have ben copied into Destination Directory exit 0;