#!/bin/sh # bisect through the database dumps to see when a specific thing # appeared first expr="$1" shift dumps=$( find '/data/backup/mysql' -mindepth 1 -maxdepth 1 -name 'database-*.xz' "$@" -exec ls -tr {} + \ | sort ) has=$( printf '%s\n' "$dumps" | \ tail -n1 ) if ! xzgrep -q "${expr}" "${has}"; then >&2 printf 'cannot find "%s" in the latest dump - swapping directions\n' "${expr}" dumps=$( printf '%s\n' "${dumps}" | \ tac ) has=$( printf '%s\n' "$dumps" | \ tail -n1 ) if ! xzgrep -q "${expr}" "${has}"; then >&2 printf 'cannot find "%s" in the earliest dump either - swapping directions did not help\n' "$*" exit 1 fi fi has_not=$( printf '%s\n' "$dumps" | \ head -n1 ) if xzgrep -q "${expr}" "${has_not}"; then >&2 printf 'first dump does also have "%s"\n' "$*" exit 1 fi count=$( printf '%s\n' "${dumps}" | \ wc -l ) >&2 printf '%s dumps to check\n' "${count}" while [ "${count}" -gt 2 ]; do pivot=$( printf '%s\n' "${dumps}" | \ sed -n ' \@^'"${has_not}"'$@,\@^'"${has}"'$@p ' | \ sed -n ' '"$((count/2+1))"' p ' ) >&2 printf 'looking into "%s" ... ' "${pivot}" if xzgrep -q "${expr}" "${pivot}"; then >&2 printf 'has' has="${pivot}" else >&2 printf 'has not' has_not="${pivot}" fi count=$( printf '%s\n' "${dumps}" | \ sed -n ' \@^'"${has_not}"'$@,\@^'"${has}"'$@p ' | \ wc -l ) >&2 printf ' (%s dumps remaining)\n' "${count}" done printf '%s has not\n%s has\n' "${has_not}" "${has}"