#!/bin/sh set -eu usage() { cat <<-'EOF' Usage: series FILENAME series -h EOF } help() { cat <<-'EOF' Options: -h, --help show this message FILENAME the sentinel file to be touched Enumerate and sort all items of a collection type, and notify them about their '<link rel="next" ... />' and '<link rel="prev" .../>. The collection type and language are inferred by FILENAME. The "notifying" part is done via a "$TARGET.next" file, that is, a ".next" file is created to notify "$TARGET" about which item is next to it via the content of the file. The same applies for ".prev" files. Examples: Generate the ".next" and ".prev" files for english pastebins: $ index src/en/pastebin/index.series EOF } for flag in "$@"; do case "$flag" in --) break ;; --help) usage help exit ;; *) ;; esac done while getopts 'h' flag; do case "$flag" in h) usage help exit ;; *) usage >&2 exit 2 ;; esac done shift $((OPTIND - 1)) . src/lib.sh FILENAME="${1:-}" eval "$(assert_arg "$FILENAME" 'FILENAME')" DIR="$(dirname "$FILENAME")" find "$DIR"/*.sortdata 2>/dev/null | sort -n | xargs cat | awk ' BEGIN { split("", items) } { items[NR] = $0 } END { first = 1 last = length(items) for (i in items) { item = items[i] if (i != first) { file = item ".prev" prev = items[i-1] print prev > file } if (i != last) { file = item ".next" nextt = items[i+1] print nextt > file } } } ' touch "$FILENAME"