zmv 命令在匹配模式后重命名文件

zmv 命令在匹配模式后重命名文件

我试图找到一个解决方案问题使用zmv.我无法使用 找到准确的解决方案zmv。这是我到目前为止能想到的。

这里,我可以将所有文件(如 、 等)重命名1.jpg为,2.jpg并使用以下命令,34.jpg001.jpg002.jpg034.jpg

zmv '(<1->).jpg' '${(l:3::0:)1}.jpg'

现在,我需要修改zmv以在开头具有一些模式,以便我可以重命名文件。但是,我无法做到这一点。我能找到的最接近的是这个解决方案

c=1 base='0-' zmv '*.jpg' '${base}${(l:3::0:)$((c++))}.jpg'

但是,上述方法的问题是,如果我的文件为0-1.jpg, 0-44.jpg,则上述命令会将其替换为0-001.jpgand0-002.jpg而不是0-001.jpgand 0-044.jpg

我应该如何修改zmv命令来完成所需的重命名?

答案1

您可以使用-l 扩展标志:

l:expr::字符串1::字符串2:

将生成的单词填充到左侧。如果需要,每个单词都会被截断并放置在 expr 字符宽的字段中。

参数 :string1: 和 :string2: 是可选的;可以都不给出,也可以给出第一个,或者两者都给出。请注意,三个参数中的每一个都必须使用相同的分隔符对。左侧的空格将用 string1 填充(根据需要经常连接)或空格(如果未给出 string1)。如果同时给出了 string1 和 string2,则在使用 string1 生成任何剩余的填充之前,将 string2 直接插入到每个单词的左侧一次,并根据需要进行截断。

如果 MULTIBYTE 选项有效,则还可以给出标志 m,在这种情况下,宽度将用于计算填充;否则,单个多字节字符将被视为占用一个宽度单位。

如果 MULTIBYTE 选项无效,则字符串中的每个字节都被视为占用一个宽度单位。

控制字符始终假定为一单位宽;这允许该机制用于生成控制字符的重复。

尝试:

zmv '([0-9])-([0-9]##).(jpg)' '$1-${(l:3::0:)2}.$3'

答案2

请注意,它将${(l:3::0:)var}用零填充,但也会截断var长度超过 3 个字符的 a(1234将更改为234)。

另一种选择是使用typeset -Z3à la ksh

typeset -Z3 z3
zmv '([0-9]-)(<->)(.jpg)' '$1${${z3::=$2}+}$z3$3'

我们使用${${z3::=$2}+}上面的方法来触发对 的分配z3。接下来用 0 填充$z3进行扩展。z3

相关内容