Hello *nix friends,
I've written a shell script that allow web admin's to copy file/folder from a development site to the production site. It's more or less a poor man SVN.
I'm posting the script here because I was able to get many questions answered through this forum and also, I want to improve this script. It works as is but there is probably more efficiencies that could be incorporated. Finally, I've keep the comments down for brevity.
#!/bin/sh
# Make copies of files and folders from a dev site to production site
# requires two arguments, the file or folder name ($1) a destination path ($2)
# the third argument ($3) is optional and specifies a search path to
# look for files/folders in sub directories off the root
#### usage examples ####
# with dest and search path: ./copy.sh fileName.ext path/to/dest/ path/to/search
# with dest only: ./copy.sh folderName path/to/dest
# with current dir: ./copy.sh fileName.ext .
#### variables ####
# log stdout and stderr
LOGFILE=copyFile.log
DATE=`date`
# file or folder name to copy
HANDLE="$1"
# destination is the location to copy files and folders
DEST="$2"
# optional - appends a sub directory path to SRC
SEARCH="$3"
# previous is a backup folder of current production file
PREV="previous"
# short variable for development root
SRC="/path/to/development/root/"
# short variable for production root
PROD="/path/to/production/root/"
#### copy process ####
# change director to the development root
cd $SRC
# test if handle is a file and NOT a directory
isFile=$(find $SRC$SEARCH -type f -name $HANDLE -print0)
if [[ -f $isFile ]]; then
# test if dest was passed as a "." dot (or the site root directory)
if [[ $DEST == "." ]] ; then
#split handle string at delimiting dot
NAME=${HANDLE%.*}
EXT=${HANDLE#*.}
# if backup directory previous isn't present in site root, make it
if [[ ! -d "$PREV" ]]; then
mkdir $PREV 2>&1 > /dev/null
fi
# make a backup of the current production file
find $PROD -type f -name $HANDLE -print0 | xargs -0 -I '{}' cp '{}' ${SRC}previous/$NAME"_bk."$EXT
#now copy new file from dev to prod
cp $isFile $PROD
echo $DATE-"The file "$HANDLE" was copied to root at "$PROD 1>>$LOGFILE
# else the dest argument is a sub folder of root, line 52
else
#split the string string at delimiting dot
NAME=${HANDLE%.*}
EXT=${HANDLE#*.}
# look in dest, if a backup directory isn't present make one
cd $DEST
if [[ ! -d "$PREV" ]]; then
mkdir $PREV 2>&1 > /dev/null
fi
# back to development root directory
cd -
#### make three copies ####
# backup the current production file
find $PROD$SEARCH -type f -name $HANDLE -print0 | xargs -0 -I '{}' cp '{}' ${DEST}previous/$NAME"_bk."$EXT
# now copy the new file to the dev target mirror dir
cp $isFile $DEST
# finally, copy the new file to the production target directory
cp $isFile $PROD$DEST
# echo feedback to the log file
echo $DATE-"The file "$HANDLE" copied to the sub folder: "$DEST 1>>$SRC$LOGFILE
#close if statement from line 55 and exit script
fi
exit
# else if isFile is empty,
elif [[ -z $isFile ]]; then
# assign path info to isDir
isDir=$(find $SRC$SEARCH -type d -name $HANDLE)
# backup the current production folder
# remember we are working from SRC root, all path info relative to SRC
find $PROD$SEARCH -type d -name $HANDLE | xargs -I '{}' cp -R '{}' ${DEST}previous/
# copy new directory to dev target mirror dir
cp -R $isDir $DEST
# now make a new or overwrite an old folder at the production site
cp -R $isDir $PROD$DEST
# echo feedback to the log file
echo $DATE-"The folder "$HANDLE" copied to: "$DEST 1>>$SRC$LOGFILE
else
# if everything else fails, echo feedback to the log file
echo $DATE-"Error-Nothing copied or created for "$HANDLE 1>>$SRC$LOGFILE
fi
If you are working from a local server and need to copy files to a remote server, you could switch out the 'cp' statements with 'scp' statements.
Okay, any thoughts and/or improvements are welcomed.
rwhite35