From: Wayne Davison <wayned@users.sourceforge.net>
To: Bart Schaefer <schaefer@brasslantern.com>
Cc: Zsh Workers <zsh-workers@sunsite.dk>
Subject: PATCH: -W option for zmv (updated)
Date: Thu, 28 Mar 2002 17:12:24 -0800 (PST) [thread overview]
Message-ID: <Pine.LNX.4.33L2.0203281524340.16964-100000@phong.blorf.net> (raw)
In-Reply-To: <1020328155914.ZM1111@candle.brasslantern.com>
On Thu, 28 Mar 2002, Bart Schaefer wrote:
> My only concern is that it should complain if the number of wildcards in
> the destination is less than the number of wildcards in the source.
Good point. I've made it complain and exit if the counts don't match.
> integer N=0
> x=(x x x x x x)
> print ${(e)x//x/\$[++N]}
Thanks! That's the nudge I needed to make things more efficient.
The only weird thing I ran into was when I put the find pattern into a
variable so I could reuse it in 3 spots. To get things working I had to
change the "\/" into "[/]" or the "\*\*#\/" pattern wouldn't match.
Strange.
Here's my latest patch. I'll probably commit this after a little more
testing (unless someone has an objection).
..wayne..
---8<------8<------8<------8<---cut here--->8------>8------>8------>8---
Index: zsh/Functions/Misc/zmv
--- zsh/Functions/Misc/zmv 28 Aug 2001 20:28:18 -0000 1.9
+++ zsh/Functions/Misc/zmv 29 Mar 2002 01:04:32 -0000
@@ -13,9 +13,14 @@
# path. Note that you need to write it like this; you can't get away with
# '(**/*).txt'.
# zmv -w '**/*.txt' '$1$2.lis'
-# This is the lazy version of the one above; zsh picks out the patterns
-# for you. The catch here is that you don't need the / in the replacement
-# pattern. (It's not really a catch, since $1 can be empty.)
+# noglob zmv -W **/*.txt **/*.lis
+# These are the lazy version of the one above; with -w, zsh inserts the
+# parentheses for you in the search pattern, and with -W it also inserts
+# the numbered variables for you in the replacement pattern. The catch
+# in the first version is that you don't need the / in the replacement
+# pattern. (It's not really a catch, since $1 can be empty.) Note that
+# -W actually inserts ${1}, ${2}, etc., so it works even if you put a
+# number after a wildcard (such as zmv -W '*1.txt' '*2.txt').
# zmv -C '**/(*).txt' ~/save/'$1'.lis
# Copy, instead of move, all .txt files in subdirectories to .lis files
# in the single directory `~/save'. Note that the ~ was not quoted.
@@ -91,6 +96,8 @@
# where <oldname> and <newname> are filenames generated.
# -w Pick out wildcard parts of the pattern, as described above, and
# implicitly add parentheses for referring to them.
+# -W Just like -w, with the addition of turning wildcards in the
+# replacement pattern into sequential ${1} .. ${N} references.
# -C
# -L
# -M Force cp, ln or mv, respectively, regardless of the name of the
@@ -116,12 +123,12 @@
local f g args match mbegin mend files action myname tmpf opt exec
local opt_f opt_i opt_n opt_q opt_Q opt_s opt_M opt_C opt_L
-local opt_o opt_p opt_v opt_w MATCH MBEGIN MEND
+local opt_o opt_p opt_v opt_w opt_W MATCH MBEGIN MEND
local pat repl errstr fpat hasglobqual opat
typeset -A from to
integer stat
-while getopts ":o:p:MCLfinqQsvw" opt; do
+while getopts ":o:p:MCLfinqQsvwW" opt; do
if [[ $opt = "?" ]]; then
print -P "%N: unrecognized option: -$OPTARG" >&2
return 1
@@ -173,19 +180,32 @@
return 1
fi
-if [[ -n $opt_w ]]; then
+if [[ -n $opt_w || -n $opt_W ]]; then
# Parenthesise all wildcards.
- local newpat
+ local tmp find
+ integer cnt=0
# Well, this seems to work.
# The tricky bit is getting all forms of [...] correct, but as long
# as we require inactive bits to be backslashed its not so bad.
- newpat="${pat//\
-(#m)(\*\*#\/|[*?]|\<[0-9]#-[0-9]#\>|\[(\[:[a-z]##:\]|\\\[|\\\]|[^\[\]]##)##\])\##\
-/($MATCH)}"
- if [[ $newpat = $pat ]]; then
- print -P "%N: warning: no wildcards were found" >&2
+ find='(#m)(\*\*#[/]|[*?]|\<[0-9]#-[0-9]#\>|\[(\[:[a-z]##:\]|\\\[|\\\]|[^\[\]]##)##\])\##'
+ tmp="${pat//${~find}/$[++cnt]}"
+ if [[ $cnt = 0 ]]; then
+ print -P "%N: warning: no wildcards were found in search pattern" >&2
else
- pat=$newpat
+ pat="${pat//${~find}/($MATCH)}"
+ fi
+ if [[ -n $opt_W ]]; then
+ # Turn wildcards into ${1} .. ${N} references.
+ local open='${' close='}'
+ integer N=0
+ repl="${repl//${~find}/$open$[++N]$close}"
+ if [[ $N != $cnt ]]; then
+ print -P "%N: error: number of wildcards in each pattern must match" >&2
+ return 1
+ fi
+ if [[ $N = 0 ]]; then
+ print -P "%N: warning: no wildcards were found in replacement pattern" >&2
+ fi
fi
fi
---8<------8<------8<------8<---cut here--->8------>8------>8------>8---
next prev parent reply other threads:[~2002-03-29 1:13 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-03-28 0:48 Potential improvement for zmv Wayne Davison
2002-03-28 15:59 ` Bart Schaefer
2002-03-29 1:12 ` Wayne Davison [this message]
2002-03-29 2:38 ` PATCH: -W option for zmv (updated) Bart Schaefer
2002-03-29 5:32 ` Wayne Davison
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Pine.LNX.4.33L2.0203281524340.16964-100000@phong.blorf.net \
--to=wayned@users.sourceforge.net \
--cc=schaefer@brasslantern.com \
--cc=zsh-workers@sunsite.dk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).