#!/bin/bash ################################################################################ ## Home Config Backup Script ## 2012-06-29 ################################################################################ ## Note for Zsh: because of the KSH-style arrays (index starting at 0), you ## cannot use array index to append elements to arrays -- or the KSH_ARRAYS ## option for zsh must be used. ##============================================================================== ## Options ##============================================================================== ## Set Debug mode on DEBUG=no if [ "$DEBUG" = "yes" ]; then set -x fi ## Variables OLDPATH="$(pwd)" cd "$HOME" SCRIPTPATH="$(readlink -f $(dirname "$0"))" COMPRESSION="gz" ARCHIVENAME="$HOME/home-config-$(date "+%y-%m-%d-%H%M%S")" ARCEXT="tar.gz" ARCOPT="cvzf" print_help() { echo "Synopsis:" echo " $1 [-o ARCHIVENAME] [-m COMPRESSION]" echo echo "Usage:" echo " default: " echo " -h:\t\tDisplay this help." echo " -m: compression method among" echo " * gz (default)" echo " * xz" echo " -o: output archive name (without extension)." echo "" echo "Note: xz is not available on older Unices." } while getopts ":hm:o:" opt; do case $opt in h) print_help "$0" exit 1 ;; m) COMPRESSION="$OPTARG" ;; o) ARCHIVENAME="${OLDPATH}/$OPTARG" ;; ?) print_help "$0" exit 1 ;; :) echo "Missing argument." echo "Use $0 -h for help." exit 1 ;; esac done shift $(($OPTIND - 1)) case $COMPRESSION in "gz") ARCEXT="tar.gz" ARCOPT="cvzf" ;; "xz") ARCEXT="tar.xz" ARCOPT="cvJf" ;; *) ARCEXT="tar.gz" ARCOPT="cvzf" ;; esac if [ "${DEBUG}" = "yes" ]; then echo "COMPRESSION=[$COMPRESSION]" echo "ARCHIVENAME=[$ARCHIVENAME]" echo "ARCEXT=[$ARCEXT]" echo "ARCOPT=[$ARCOPT]" fi if [ -e "${ARCHIVENAME}.${ARCEXT}" ]; then echo "Error: ${ARCHIVENAME}.${ARCEXT} already exists!">&2 exit 0 fi ##============================================================================== ## Arch Linux packages list ##============================================================================== if [ -e "/usr/bin/pacman" ]; then ARCH_PKG_OFFICIAL="$HOME/.arch-pkg-official" ARCH_PKG_EXPLICIT="$HOME/.arch-pkg-explicit" ARCH_PKG_AUR="$HOME/.arch-pkg-aur" ARCH_MIRRORS="$HOME/.arch-mirrors" PKG_LOCAL='pacman -Qq | sort' PKG_FOREIGN='pacman -Qmq | sort' PKG_EXPLICIT='pacman -Qeq | sort' diff <(eval "${PKG_LOCAL}") <(eval "${PKG_FOREIGN}") --new-line-format='' --unchanged-group-format='%>' >"${ARCH_PKG_OFFICIAL}-$(hostname)" eval "${PKG_EXPLICIT}" >"${ARCH_PKG_EXPLICIT}-$(hostname)" eval "${PKG_FOREIGN}" >"${ARCH_PKG_AUR}-$(hostname)" cat /etc/pacman.conf | grep "^\[">"${ARCH_MIRRORS}-$(hostname)" fi ##============================================================================== ## Let's fill the file list: ##============================================================================== FILELIST=() # Arch Linux package list if [ -e "/usr/bin/pacman" ]; then for i in $(find . -maxdepth 1 -name '.arch*' -exec basename {} \;) do FILELIST=(${FILELIST[*]} "$i") done fi # Awesome for i in $(find .config/awesome \( -name "*.lua" -o -name "*.sh" \) -type f) do FILELIST=(${FILELIST[*]} "$i") done # cmus # FILELIST=(${FILELIST[*]} "$(ls .cmus/{autosave,*.theme}) ") FILELIST=(${FILELIST[*]} "$(ls .cmus/autosave)") # Conky FILELIST=(${FILELIST[*]} ".conkyrc") # Emacs FILELIST=(${FILELIST[*]} ".emacs") FILELIST=(${FILELIST[*]} ".emacs.d/plugins") FILELIST=(${FILELIST[*]} ".emacs.d/abbrev_defs") # GTK FILELIST=(${FILELIST[*]} ".gtkrc-2.0") FILELIST=(${FILELIST[*]} ".config/gtk-3.0/settings.ini") # Luakit FILELIST=(${FILELIST[*]} ".config/luakit/") # LXTerminal FILELIST=(${FILELIST[*]} ".config/lxterminal/lxterminal.conf") # MPlayer # FILELIST=(${FILELIST[*]} ".mplayer") # Mutt FILELIST=(${FILELIST[*]} ".muttrc") FILELIST=(${FILELIST[*]} ".ml.sh") # Nano FILELIST=(${FILELIST[*]} ".nanorc") # Netinit FILELIST=(${FILELIST[*]} ".netinit") # Ranger for i in $(ls -d --indicator-style=none .config/ranger/* | grep -vi 'pycache\|bookmarks\|history\|tagged') do FILELIST=(${FILELIST[*]} "$i") done # rtorrent FILELIST=(${FILELIST[*]} ".rtorrent.rc") # Shells FILELIST=(${FILELIST[*]} ".bashrc") FILELIST=(${FILELIST[*]} ".zshrc") for i in $(ls .shell.d/*|grep -vi 'bhistory') do FILELIST=(${FILELIST[*]} "$i") done # Taskwarrior FILELIST=(${FILELIST[*]} ".taskrc") # TeXlive # for i in $(find texmf -type f|grep -vi 'moderncv/examples\|moderncv/manual\|.bzr') # do # FILELIST=(${FILELIST[*]} "$i") # done # Vim FILELIST=(${FILELIST[*]} ".vimrc") # WMFS FILELIST=(${FILELIST[*]} ".config/wmfs") # Xinit FILELIST=(${FILELIST[*]} ".xinitrc") # Xresource FILELIST=(${FILELIST[*]} ".Xresources") # Xscreensaver # FILELIST=(${FILELIST[*]} ".xscreensaver") ##============================================================================== ## Archiving ##============================================================================== if [ "$DEBUG" = "yes" ]; then tar ${ARCOPT} "$ARCHIVENAME" -C "$HOME" ${FILELIST[*]} -C "$SCRIPTPATH" "$(basename "$0")" --exclude-vcs else tar ${ARCOPT} "${ARCHIVENAME}.${ARCEXT}" -C "$HOME" ${FILELIST[*]} -C "$SCRIPTPATH" "$(basename "$0")" --exclude-vcs >/dev/null fi ##============================================================================== ## Cleaning ##============================================================================== cd "${OLDPATH}" ## Set Debug mode off if [ "$DEBUG" = "yes" ]; then set +x fi