#!/bin/sh QUIET=false NORUN=false FORCE=false DIR="$(dirname "$(realpath "$0")")" main() { action=homify while getopts hqnfdx OPT do case "$OPT" in (h) usage; exit 0 ;; (q) QUIET=true ;; (n) NORUN=true ;; (f) FORCE=true ;; (d) action=dotify ;; (x) set -x ;; (*) usage; exit 1 ;; esac done shift $((OPTIND - 1)) "$action" "$@" } usage() { cat<&2 "* $@"; } run() { log "$@"; $NORUN || "$@"; } mklink() { # mklink SOURCE DEST # make hardlinks to DEST from SOURCE -- making directories $NORUN || test -d "$(dirname "$2")" || run mkdir -p "$(dirname "$2")" if ! test -f "$2" then run ln "$1" "$2" elif test -f "$2" && "$FORCE" then run ln -f "$1" "$2" else log "$2 exists: skipping" fi } getfiles() { d="$1"; shift for file do find "$d" -type f \ -a -not -name "$(basename "$0")" \ -a -not -path "$d/.git*" \ -a -iname "$file" done } homify() { getfiles "$DIR" "$@" | while read -r dot do mklink "$dot" "$HOME/.${dot#$DIR/}" done } dotify() { getfiles "$@" | while read -r file do lf="${file##$HOME/}" # remove $HOME lf="${lf#.}" # remove starting dot mklink "$file" "$DIR/$lf" done } main "$@"