#!/usr/bin/env sh # YES_ZSH # YES_BASH # YES_DASH # YES_ASH bak() { ### @- ### backup files by creating copies and appending ".bak" to their names. ### this calls itself recursively to avoid clobbering existing backups. ### ### ``` ### $ touch -d '2001-12-25 16:30:00' butts ### $ bak butts ### $ touch butts ### $ bak butts ### $ ls -l ### total 0 ### -rw-r--r-- 1 notwa None 0 Aug 1 08:02 butts ### -rw-r--r-- 1 notwa None 0 Aug 1 08:02 butts.bak ### -rw-r--r-- 1 notwa None 0 Dec 25 2001 butts.bak.bak ### ``` [ $# -gt 0 ] || { printf "%s\n" "$0: too few arguments" >&2; return 1; } local ret=0 f= for f; do if [ -e "$f.bak" ]; then bak "$f.bak" || { ret=1; continue; } fi cp -p "$f" "$f.bak" || ret=1 done return $ret } [ -n "${preload+-}" ] || bak "$@"