# 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;