The Question is:
Is it possible to use a wildcard rename to remove suffixes from
extended filenames with multiple suffixes, e.g.,
ren *.p.z *.p_z
changes file.p.z to file.p.p_z . what I'd like to get is file.p_z . The
rename/wildcard behavior is one of my favorite vms features.and I' d like to
be able to use in these cases, too.
The Answer is :
The OpenVMS Wizard will assume that this involves files on an ODS-5
The semantics you request would mean that the wild card character in the
output filespec would have to mean "the string matched by the wildcard
in the input filespec". This is the behaviour of the DOS RENAME
The OpenVMS Wizard agrees that this could be a useful feature, however
it cannot be easily implemented within the OpenVMS wildcard framework.
As OpenVMS permits multiple wildcards in filespecs, there is no way from
the output filespec to refer to particular wildcard matched strings from
the input filespec. DOS gets away with it because it only permits a single
wildcard in a filespec, thus there is no ambiguity as to which string is
referred from the output filespec.
So, without implementing some kind of parameter-based syntax for matching
and selecting wildcard strings, it's not possible to implement these
semantics within the RENAME or COPY commands. Given the necessary
complexity of such a syntax, and its reasonably limited application
(however useful!), the Wizard feels it unlikely DCL would be changed
to include this kind of function.
What OpenVMS does implement is a wildcard that replaces an entire chunk
of a filename. With ODS-5, the last "chunk" after the period is the
file extension chunk (well, the last chunk that isn't also the file
version), with the rest being the filename. Partial-field replacements
based on wildcards are not permitted -- you can only replace the entire
field -- for reasons cited above.
On the other hand, this type of RENAME operation is easily achieved with
a short DCL command procedure. For example:
$ LOOP: F=F$SEARCH("*.p.z")
$ IF F.EQS."" THEN EXIT
$ RENAME 'f' 'new'
$ GOTO loop
For a more general solution, here is a procedure which will take a
wildcard filespec and RENAME any files with multiple "."'s in the file
name so that the filetype starts at the first "." and all subsequent
"."'s are replaced with "_"
$ IF p1.EQS."" THEN INQUIRE p1 "Filespec"
$ IF f.EQS."" THEN EXIT
$ IF l.LT.F$LENGTH(fname)
$ IF l.LT.F$LENGTH(ftype)
$ GOTO loop1
$ RENAME/LOG 'f' 'fname'.'ftype'
$ IF F$EDIT(f,"UPCASE").NES.F$EDIT(F$PARSE(p1,f),"UPCASE") THEN GOTO loop
Tools such as Perl can also perform various sorts of search-and-replace
operations, and may be of interest here.