![使用 zmv 重命名文件](https://linux22.com/image/1308024/%E4%BD%BF%E7%94%A8%20zmv%20%E9%87%8D%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6.png)
我今天早上才发现 zmv。
为了测试它,我创建了几个文件。
test1.txt test2.txt test3.txt
我正在尝试用 zmv 重命名它们,我希望得到这个输出:
test-1.txt test-2.txt test-3.txt
当我尝试使用通配符时收到一条错误消息:
zmv '(*)([0-9]{1,})(.txt)' '$1-$2$3'
zmv: error: number of wildcards in each pattern must match
我做错什么了吗(答案必须是肯定的:))
答案1
-
您是否只想在文件名中添加一个?请尝试以下操作:
zmv -n 'test(*).txt' 'test-${1}.txt'
开关-n
会向您显示无需实际执行任何操作就会发生的情况。
答案2
这是一个非常迟的回复,因为我也遇到了这个问题,为此绞尽了脑汁。我终于弄清楚了我使用的 zsh 自定义层 (yadr) 是 zmv 的别名。alias zmv="noglob zmv -W"
我相信即使是流行的 oh-my-zsh 层也是如此。
检查你的 zmv 是否有别名。如果是,则使用取消别名unalias zmv
,那个可怕的number of wildcards must match
错误现在应该会消失
答案3
如果第一个参数应该是一个正则表达式,那么问题可能在于您使用了*
. .*
(*
是 0 个或多个运算符,.
匹配任何单个字符)。
因此,第一个括号可能被直接理解为运算符的参数*
,而不是打开一个捕获组。
试用http://www.regexr.com/用于交互式正则表达式教程/测试器/构建器。
答案4
又一个非常晚的回复,但因为以上答案似乎都没有回答我的问题,所以这里有一个答案(使用 zsh 5.8)。
❯ ls
test1.txt test2.txt test3.txt
如果我尝试运行你的命令,我会得到不同的错误。不确定这是不是 zsh 的较新版本,或者你的问题是否是上述提到的别名。
❯ zmv -n '(*)([0-9]{1,})(.txt)' '$1-$2$3'
zmv:239: no matches found: (*)([0-9]{1,})(.txt)
问题是{1,}
。我不确定你想用它解决什么问题?
如果您只想匹配单个数字的文件,那么您可以这样做(-n
向您展示它在不实际改变任何内容的情况下会做什么):
❯ zmv -n '(*)([0-9])(.txt)' '$1-$2$3'
mv -- test1.txt test-1.txt
mv -- test2.txt test-2.txt
mv -- test3.txt test-3.txt
如果您想匹配一个或多个数字,那么您可以这样做:
> zmv -n '(*)([0-9]*)(.txt)' '$1-$2$3'
mv -- test1.txt test-1.txt
mv -- test2.txt test-2.txt
mv -- test3.txt test-3.txt
就我个人而言,我会这样写,因为我认为这样更清楚:
❯ zmv -n '(*)([0-9].txt)' '$1-$2'
mv -- test1.txt test-1.txt
mv -- test2.txt test-2.txt
mv -- test3.txt test-3.txt
或者最简单、最明显的是:
❯ zmv -n 'test(*).txt' 'test-$1.txt'
mv -- test1.txt test-1.txt
mv -- test2.txt test-2.txt
mv -- test3.txt test-3.txt