#!/bin/bash # Resource file utility. # $I$ # Copyright 2006 Perette Barella. # Released under the GNU public license. ###################################################################### # Function: usage # Purpose: # Arguments: # Returns: # Author: Perette Barella #--------------------------------------------------------------------- function usage { echo "Usage: $arg0 [options] ..." echo "Actions are:" echo " expose copies resource component into regular file." echo " hide deletes resource components that are exposed." echo " strip removes resource components from files entirely." echo " integrate combine exposed resource components into respective files." echo " list list files with resource forks." echo "Options:" echo " -r Removes source file after completion." echo " -u Update existing files." echo " -v display progression information." echo " -f file read or write affected list from file." echo " (Prevents unnecessary change to file update times.)" exit 1 } ##### End of function usage ##### ###################################################################### # Function: parse_arguments # Purpose: Parses the command line arguments # Arguments: The command line arguments. # Returns: Number of arguments parsed. # Author: Perette Barella #--------------------------------------------------------------------- function parse_arguments { typeset option REMOVE=false UPDATE=false VERBOSE=false FILE="" while getopts 'f:urv?' option do case "$option" in f) FILE="$OPTARG" ;; u) UPDATE=true ;; r) REMOVE=true ;; v) VERBOSE=true ;; *) usage ;; esac done typeset status=0 return $((OPTIND - 1)) } ##### End of function parse_arguments ##### ###################################################################### # Function: integrate_resources # Purpose: # Arguments: # Returns: # Author: Perette Barella #--------------------------------------------------------------------- function integrate_resources { typeset status=0 place="$1" typeset hidden exposed find -x "$place" -name '*.resource' -type f -print | while read file do base=$(basename "$file" .resource) dir=$(dirname "$file") if [ -s "$dir/$base/..namedfork/rsrc" ] then # See if the exposed and hidden resources vary. hidden=$(cksum < "$dir/$base/..namedfork/rsrc") exposed=$(cksum < "$file") if [ "$hidden" = "$exposed" ] then $REMOVE && rm -f "$file" continue fi if [ "$UPDATE" = "false" ] then echo "$file: Resource exists already." 1>&2 continue fi fi if [ ! -f "$dir/$base" ] then echo "$dir/$base: File doesn't exist to install resource." 1>&2 status=1 elif cp -p "$file" "$dir/$base/..namedfork/rsrc" then $REMOVE && rm "$file" $VERBOSE && echo "$file" else status=1 fi done return $status } ##### End of function integrate_resources ##### ###################################################################### # Function: expose_resources # Purpose: # Arguments: # Returns: # Author: Perette Barella #--------------------------------------------------------------------- function expose_resources { typeset status=0 place="$1" typeset hidden exposed [ "$FILE" != "" ] && > "$FILE" find -x "$place" \! -name '*.resource' -type f -print | while read file do # If no resource, skip the file. [ ! -s "$file/..namedfork/rsrc" ] && continue [ "$FILE" != "" ] && printf '%s\0' "$file.resource" >> "$FILE" if [ -s "$file.resource" ] then # See if the exposed and hidden resources vary. hidden=$(cksum < "$file/..namedfork/rsrc") exposed=$(cksum < "$file.resource") if [ "$hidden" = "$exposed" ] then $REMOVE && > $file/..namedfork/rsrc continue fi if [ "$UPDATE" = "false" ] then echo "$file.resource: File exists already." 1>&2 continue fi fi if cp -p "$file/..namedfork/rsrc" "$file.resource" then $REMOVE && > "$file/..namedfork/rsrc" $VERBOSE && echo "$file" else status=1 fi done return $status } ##### End of function expose_resources ##### ###################################################################### # Function: list_resources # Purpose: # Arguments: # Returns: # Author: Perette Barella #--------------------------------------------------------------------- function list_resources { typeset status=0 find -x "$location" -print | while read name do [ -s "$name/..namedfork/rsrc" ] && echo "$name" done return $status } ##### End of function list_resources ##### ###################################################################### # Function: strip_resources # Purpose: # Arguments: # Returns: # Author: Perette Barella #--------------------------------------------------------------------- function strip_resources { typeset status=0 find -x "$location" -print | while read name do [ ! -s "$name/..namedfork/rsrc" ] && continue if > "$name/..namedfork/rsrc" then $VERBOSE && echo "$name" else status=1 fi done return $status } ##### End of function strip_resources ##### ###################################################################### # Function: hide_resources # Purpose: # Arguments: # Returns: # Author: Perette Barella #--------------------------------------------------------------------- function hide_resources { typeset status=0 verbose="" $VERBOSE && verbose="-print" if [ "$FILE" != "" ] then xargs -0 rm -f < "$FILE" || status=1 rm "$FILE" else find -x "$location" -name '*.resource' $verbose -delete || status=1 fi return $status } ##### End of function hide_resources ##### arg0=$(basename $0) parse_arguments "$@" shift $? [ $# -eq 0 ] && usage action="$1" shift export IFS="" status=0 for location in "$@" do if [ ! -d "$location" ] then echo "$location: not found." status=1 continue fi case "$action" in expose) expose_resources "$location" ;; hide) hide_resources "$location" ;; strip) strip_resources "$location" ;; integrate) integrate_resources "$location" ;; list) list_resources "$location" ;; *) echo "$arg0: Invalid action." usage exit 1 ;; esac done exit $status