BACKUP_DIR=${HOME}/.local/config_backup # list_clones # # list cloned files # print a tab separated file pair (original file, clonded file) # # /mandatory # @param 1: directory of original file # @param 2: directory of clones list_clones () { ORIG=$1 CLONE=$2 if [ -z "$1" -o -z "$2" ]; then return; fi find "${CLONE}/" -maxdepth 1 -mindepth 1 -type f | while read f; do filename=$( basename "${f}" ) if [ -f "${ORIG}/${filename}" ]; then echo -e "${ORIG}/${filename}\t${f}" fi done } # list_file_pairs # # list files where a clone exists # print a tab separated file pair (original file, clonded file) list_file_pairs () { # /usr/lib vs. /etc ORIG=/usr/lib CLONE=/etc for d in udev/rules.d do list_clones "${ORIG}/${d}" "${CLONE}/${d}" done # /usr/share vs. /etc ORIG=/usr/share CLONE=/etc for d in eg25-manager do list_clones "${ORIG}/${d}" "${CLONE}/${d}" done } # create_dir # # create a (sub)-directory if it does not exist # # /mandatory # @param 1: directory name create_dir () { dir=$1 echo "${dir}" | grep -q '/../' result=$? if [ ${result} -eq 0 ]; then echo "directory must not contain .." exit 1 fi [ -d "${dir}" ] || mkdir -p "${dir}" } # main # # the main program main () { list_file_pairs | while read pair; do orig_file=$( echo "${pair}" | awk -v FS='\t' '{print $1}' ) clone_file=$( echo "${pair}" | awk -v FS='\t' '{print $2}' ) diff -q "${orig_file}" "${clone_file}" > /dev/null result=$? if [ ${result} -ne 0 ]; then create_dir $( dirname "${BACKUP_DIR}/${orig_file}" ) if [ ! -f "${BACKUP_DIR}/${orig_file}" ]; then cp "${orig_file}" "${BACKUP_DIR}/${orig_file}" else diff -q "${orig_file}" "${BACKUP_DIR}/${orig_file}" > /dev/null result=$? if [ ${result} -ne 0 ]; then echo "## config file \"${orig_file}\" changed, see diff below" diff -u "${BACKUP_DIR}/${orig_file}" "${orig_file}" echo "## remove backup file \"${BACKUP_DIR}/${orig_file}\" after checking the impact" echo -e "\n\n" fi fi fi done } main