function __bak_help echo -e \ "Usage: $argv[1] SOURCE..." end function __bak set program $argv[2] if [ (count $argv) -gt 2 ] for file in $argv[3..-1] function bak_name # trim / for directories set file (echo $argv[1] | sed 's/\/$//') echo "$file.(date +"%Y%m%d_%H%M%S").bak" end eval $program $file (bak_name $file) end else __bak_help $argv[1] end end function __unbak set program $argv[2] if [ (count $argv) -gt 2 ] for file in $argv[3..-1] set re_bak '(.*)\.[0-9]{8,8}_[0-9]{6,6}\.bak' set file $argv[1] set normalized (echo "$file" | sed -r "s/$re_bak/\1/g") function is_bak echo "$file" | perl -ne "print if /$re_bak/" > /dev/null end if test ! -e $file echo "File \"$file\" not exists! Cannot unbak \"$file\"." else if not is_bak $file echo "File \"$file\" don't meet bak files convention! Cannot unbak \"$file\"." else if test -e $normalized echo "File \"$normalized\" exists! Cannot unbak \"$file\"." else eval $program $file $normalized end end else __bak_help $argv[1] end end