main
link.sh
Eric Bower
·
2026-09-08
1#!/usr/bin/env bash
2
3TRACKED_FILES=(
4 bin/
5 dot_pi/agent/extensions/
6 dot_pi/agent/settings.json
7 dot_config/
8 dot/gitconfig
9 dot/mbsyncrc
10 dot_gnupg/gpg-agent.conf
11 dot_ssh/config
12 dot/msmtprc
13 dot/npmrc
14 dot/editorconfig
15 dot_config/vim/vimrc
16 dot_ctags.d/
17)
18
19TRACKED_LOCATIONS=(
20 ~/.local/bin/
21 ~/.pi/agent/extensions/
22 ~/.pi/agent/settings.json
23 ~/.config/
24 ~/.gitconfig
25 ~/.mbsyncrc
26 ~/.gnupg/gpg-agent.conf
27 ~/.ssh/config
28 ~/.msmtprc
29 ~/.npmrc
30 ~/.editorconfig
31 ~/.vim/vimrc
32 ~/.ctags.d/
33)
34
35find_files() {
36 local tfo="${TRACKED_FILES[$1]}"
37 if [[ ${tfo} == */ ]]; then
38 find "$PWD/${tfo}" -type d -exec find {} -maxdepth 1 -type f \; | sed "s|$PWD/${tfo}||" | sed "s|^/||"
39 fi
40}
41
42link_file() {
43 if [[ ! -L "$2" && ! -f "$2" && ! -d "$2" ]]; then
44 echo "Creating a link from $1 to $2"
45 mkdir -p "$(dirname "$2")"
46 ln -s "$1" "$2"
47 fi
48}
49
50unlink_file() {
51 if [[ -L "$1" ]]; then
52 echo "Unlinking $1"
53 unlink "$1"
54 fi
55}
56
57case "${1:-link}" in
58link)
59 for ((i = 0; i < ${#TRACKED_FILES[@]}; ++i)); do
60 tf="${TRACKED_FILES[$i]}"
61 tl="${TRACKED_LOCATIONS[$i]}"
62 link_file "$PWD/${tf}" "${tl}"
63 while IFS= read -r file; do
64 link_file "$PWD/${tf}${file}" "${tl}${file}"
65 done < <(find_files "$i")
66 done
67 ;;
68cleanup)
69 for ((i = 0; i < ${#TRACKED_FILES[@]}; ++i)); do
70 tl="${TRACKED_LOCATIONS[$i]}"
71 unlink_file "${tl}"
72 while IFS= read -r file; do
73 unlink_file "${tl}${file}"
74 done < <(find_files "$i")
75 done
76 ;;
77*)
78 echo "Usage: $0 [link|cleanup]" >&2
79 exit 1
80 ;;
81esac