我试图找到一个解决方案这问题使用zmv
.我无法使用 找到准确的解决方案zmv
。这是我到目前为止能想到的。
从这里,我可以将所有文件(如 、 等)重命名1.jpg
为,2.jpg
并使用以下命令,34.jpg
001.jpg
002.jpg
034.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.jpg
and0-002.jpg
而不是0-001.jpg
and 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