diff options
Diffstat (limited to 'src/symlinks')
-rwxr-xr-x | src/symlinks | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/symlinks b/src/symlinks new file mode 100755 index 0000000..4796c9c --- /dev/null +++ b/src/symlinks @@ -0,0 +1,45 @@ +#!/bin/sh +set -euo pipefail + + +usage() { + echo 'Usage: symlinks FILENAME.txt' +} + +FILENAME="${1:-}" +eval "$(assert-arg -- "$FILENAME" 'FILENAME.txt')" + + + +filter() { + awk '$1 != "" && $2 != "" && $3 == "" && $1 != "#"' +} + +getdirs() { + awk ' + n = split($1, seg, "/") { + dir = substr($1, 1, length($1) - length(seg[n])) + print dir + }' | grep . | sort | uniq | sed 's/^/mkdir -p /' +} + +gencommands() { + awk ' + n = split($1, seg, "/") { + printf "ln -fs " + for (i = 0; i < n - 1; i++) { + printf "../" + } + printf "%s %s\n", $2, $1 + }' +} + +asignorelist() { + cut -f1 | sort | uniq | sed 's|^|/|' +} + + + +cat -- "$FILENAME" | filter | getdirs | tee /dev/stderr | sh +cat -- "$FILENAME" | filter | gencommands | tee /dev/stderr | sh +cat -- "$FILENAME" | filter | asignorelist |