Well, I searched high and low....you spoke too soon....
What I found was a utility that would rename an xref from one name to another...essentially keeping the same path intact, ,but referencing updated files.
For posterity sake here it is...
;;; XREFREN.LSP
;;; Copyright (C) 2001 BCI Computer Solutions
;;;
;;; Written by:
;;; BCI Computer Solutions
;;; 2031 S.W. Fallon Lane
;;; Lake City FL. 32025
;;; United States
;;;
;;; (386)755-3831
;;; (386)867-0430
;;; draftsman@se.rr.com
;;;
;;; Author: K.E. Blackie
;;; Date: 11 June 2001
;;;
;;;
;;; THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED
;;; WARRANTY. ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR
;;; PURPOSE AND OF MERCHANTABILITY ARE HEREBY DISCLAIMED.
;;;
;;;
;;;
;;;
;;;
;;; 11 Jun 2001 -- initial development
;;; 19 Jun 2001 -- changed search from friendly name to explicit path and name
;;;
;;;----------------------------------------------------------------------------
;;; DESCRIPTION
;;;----------------------------------------------------------------------------
;;; C:XREFREN
;;;
;;; This function reassociates an existing xref with a new xref in the
;;; same path as the original xref entity. This is useful in renaming
;;; xref blocks when the xref name must be modified.
;;;
;;;----------------------------------------------------------------------------
;;; Main function
(defun C:XREFREN (/ oce) ;define main function
(setq oce (getvar "cmdecho")) ;save current cmdecho state
(setvar "cmdecho" 0) ;turn cmdecho off
(setq arg1 (getstring "\nOld xref name: ") ;obtain old xref name
arg2 (getstring "\nNew xref name: ") ;obtain new xref name
);setq
(xrefren arg1 arg2) ;call function to modify table
(setvar "cmdecho" oce) ;reset cmdecho to original setting
(princ) ;finish nice and pretty
);defun
;;;----------------------------------------------------------------------------
(defun xrefren (arg1 arg2 / filt inslist ndx newname refname refpath newarg1
reftype sset) ;define subfunction and localize variables
(setq refname (look_for arg1))
;see if old xref is in drawing
(if refname ;if it is
(progn ;then do these things as if they were one function
(setq newarg1 (cdr (assoc 2 refname)))
(setq reftype (cdr (assoc 70 refname)))
;get the type of block entry
(if (< 3 reftype) ;if it is indeed an xref and not a regular block
(setq refpath (substr (cdr (assoc 1 refname))
;extract the path where it is
1 ;from the first few characters of the full path
(+ (- (strlen (cdr (assoc 1 refname)))
;and remove
(strlen arg1)
;(strlen (cdr (assoc 2 refname)))
;the extension
4 ;which is the last four characters
);-
);+
);substr
newname (strcat refpath arg2) ;create new name w/old path
);setq
);if
(setq filt (list (cons 2 newarg1)));set a filter to select only the old xrefs
(setq sset (ssget "x" filt)) ;then select them
; (princ newname)
(if (not (findfile (strcat newname ".dwg")))
;if we cannot find the new xref in the same path
(progn ;treat the following as one command and....
(princ (strcat "\nNew xref " arg2 " not found"))
;alert the user
(setq sset nil) ;then clear the selection set to prevent an error
);progn
);if
(if sset ; if we have a selection set, then we know the path and new xref is valid
(progn ; so lets do the following as one command on the group
(command "xref" "A" newname "0,0" "" "" "")
;associate the new xref to the drawing at 0,0
(command "erase" (entlast) "");erase it because we only needed to have it in the table
(setq ndx 0) ;set up a zeroed index counter
(repeat (sslength sset) ;and repeat the follwing by the number of old xrefs we selected
(setq inslist (entget (ssname sset ndx)))
;get the entity list of the indexed xref
(entmod (subst (cons 2 arg2) (assoc 2 inslist) inslist))
;replace the old xref with the new one and modify the entity
(setq ndx (1+ ndx)) ;increment the counter
);repeat
);progn
);if
(if sset
(progn
(princ "\nCompleted reassociation of ")
(princ (rtos (fix (sslength sset))2 0))
(if (= (sslength sset) 1)
(princ " xref")
(princ " xrefs")
);if
);progn
);if
);progn
);if
);defun
;;;----------------------------------------------------------------------------
;;; subfunction look_for
;;; returns list data of an xref table entry from its path, returns nil if
;;; not found
(defun look_for( block / bn found ndx refname rval rval1 ) ;define subroutine
(setq bn (tblnext "block" t)) ;find block table entry
(while bn ;if we have one, then test it
(setq found nil) ;make sure we don't have anything in found
(if (setq refname (cdr (assoc 1 bn)));extract the path data
(progn ;then as a single command
(setq ndx (strlen refname)) ;initialize the counter to the length of the path
(while (not found) ;until we find 'found'
;read one character at a time and test it starting from the last one first
(setq rval (substr refname ndx 1))
(if (= "\\" rval) ;if we find a path separator
(progn ;execute all of the following
(setq found (substr refname (1+ ndx)(- (strlen refname) ndx)));extract the name
(setq found (substr found 1 (- (strlen found) 4)));then remove the extension
);progn
);if
(setq ndx (1- ndx)) ;decrement the counter
(if (= ndx 0) ;if we have reached 0 in our counter
(setq found T) ;we haven't found the a true xref so lets keep going
);if
);while
);progn
);if
(cond ;test the value of found now
;if we placed a marker to break the loop then continue
((= found T)(setq bn (tblnext "block")))
((= found nil)(setq bn (tblnext "block"))); if there is no found continue
;if we have found the right one break out and notify the user
((= (strcase found)(strcase block))(princ (strcat "\nFound Reference: " found))(setq rval1 bn)(setq bn nil))
(t (setq bn (tblnext "block"))) ;we have something but not what we want so continue
);cond
);while
rval1 ;explicit return of matching xref list data
);defun
(princ "\n ----- XREFREN ----- Xref Reassociation Utility Ver. 1.0 --> XREFREN to start ")