#!/bin/sh -eu # # Interactive bulk file rename using $EDITOR. # # Copyright (c) 2026 Dylan Araps # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # case $# in 0) exit; esac f=${TMPDIR:=/tmp}/.dfm-brn-$$-$# e() { rm -f "$f" || :; exit "$1"; } ( printf '%s\n' "$@" > "$f" && "${EDITOR:=vi}" "$f" && exec 3<"$f" && for _ do IFS= read -r l <&3 case ${l:?line mismatch in rename file} in "$1") set -- "$@" "# not modified: '$1'" ;; *) set -- "$@" "mv -f -- '$1' '$l'" esac shift done && { read -r l <&3 && { echo "$0: 39: line mismatch in rename file" >&2 return 1 } printf '%s\n' '# This file will be executed when the editor is closed.' \ '# Clear the file to abort.' "$@" } > "$f" && "$EDITOR" "$f" && . "$f" && e 0 ) || e 1