2
% zmv -n 'Folder One/Image \((*)\).png' folder_two/img_${(l:2::0:)1}.png zmv: error(s) in substitution: Folder One/Image (10).png and Folder One/Image (1).png both map to folder_two/img_00.png Folder One/Image (11).png and Folder One/Image (10).png both map to folder_two/img_00.png Folder One/Image (12).png and Folder One/Image (11).png both map to folder_two/img_00.png Folder One/Image (13).png and Folder One/Image (12).png both map to folder_two/img_00.png Folder One/Image (14).png and Folder One/Image (13).png both map to folder_two/img_00.png Folder One/Image (15).png and Folder One/Image (14).png both map to folder_two/img_00.png Folder One/Image (16).png and Folder One/Image (15).png both map to folder_two/img_00.png Folder One/Image (17).png and Folder One/Image (16).png both map to folder_two/img_00.png Folder One/Image (18).png and Folder One/Image (17).png both map to folder_two/img_00.png Folder One/Image (19).png and Folder One/Image (18).png both map to folder_two/img_00.png Folder One/Image (2).png and Folder One/Image (19).png both map to folder_two/img_00.png Folder One/Image (20).png and Folder One/Image (2).png both map to folder_two/img_00.png Folder One/Image (21).png and Folder One/Image (20).png both map to folder_two/img_00.png Folder One/Image (22).png and Folder One/Image (21).png both map to folder_two/img_00.png Folder One/Image (23).png and Folder One/Image (22).png both map to folder_two/img_00.png Folder One/Image (24).png and Folder One/Image (23).png both map to folder_two/img_00.png Folder One/Image (25).png and Folder One/Image (24).png both map to folder_two/img_00.png Folder One/Image (26).png and Folder One/Image (25).png both map to folder_two/img_00.png Folder One/Image (27).png and Folder One/Image (26).png both map to folder_two/img_00.png Folder One/Image (28).png and Folder One/Image (27).png both map to folder_two/img_00.png Folder One/Image (29).png and Folder One/Image (28).png both map to folder_two/img_00.png Folder One/Image (3).png and Folder One/Image (29).png both map to folder_two/img_00.png Folder One/Image (30).png and Folder One/Image (3).png both map to folder_two/img_00.png Folder One/Image (31).png and Folder One/Image (30).png both map to folder_two/img_00.png Folder One/Image (32).png and Folder One/Image (31).png both map to folder_two/img_00.png Folder One/Image (33).png and Folder One/Image (32).png both map to folder_two/img_00.png Folder One/Image (34).png and Folder One/Image (33).png both map to folder_two/img_00.png Folder One/Image (4).png and Folder One/Image (34).png both map to folder_two/img_00.png Folder One/Image (5).png and Folder One/Image (4).png both map to folder_two/img_00.png Folder One/Image (6).png and Folder One/Image (5).png both map to folder_two/img_00.png Folder One/Image (7).png and Folder One/Image (6).png both map to folder_two/img_00.png Folder One/Image (8).png and Folder One/Image (7).png both map to folder_two/img_00.png Folder One/Image (9).png and Folder One/Image (8).png both map to folder_two/img_00.png 

Why would I be getting this error?

I've tried all sorts of replacement patterns $(printf "%02d" "$1"), ${(l(2)(0))1}, and they all cause exactly the same error.

Command line to recreate my testing environment:

mkdir Folder\ One folder_two && for i in {1..33}; do touch Folder\ One/Image\ $i.png; done 

1 Answer 1

4

You need to quote¹ that argument for it to be passed literally to zmv so zmv itself can do the expansion:

zmv -n 'Folder One/Image \((<0-99>)\).png' \ 'folder_two/img_${(l[2][0])1}.png' 

I've also replaced * with <0-99> to only replace decimal representations of numbers 0 to 99 (beware l[n] also truncates to n characters besides doing padding), and l:2::0: with l[2][0] which I find easier to read.

If you don't, that unquoted folder_two/img_${(l:2::0:)1}.png is expanded to folder_two/img_00.png by the shell (assuming $1 is empty/unset in the shell), so zmv receives Folder One/Image \((<0-99>)\).png and folder_two/img_00.png as separate arguments asking it to rename all files to the same folder_two/img_00.png, hence those errors.


¹ with strong '...' quotes ($'...' would also work), not "..." inside which expansions are still performed, and you'd still need to escape the $'s as \$.

2
  • what's the difference between l[2][0] and l(2)(0)? Commented Oct 21 at 9:54
  • @Nils, (...) also works. It's a matter of preference. See info zsh flags for details. [...] works in more places than (...) as (...) are special in many contexts in Bourne-like shells. [...] also works better in the e glob qualifier as in *(e['some zsh code']), in that you don't have to worry about some zsh code containing ]. Commented Oct 21 at 10:25

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.