使用 zmv 重命名文件

使用 zmv 重命名文件

我今天早上才发现 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

相关内容