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