我正在尝试重命名一组文件。文件具有这种形式
frame\[d]+_object.bin
我的文件编号从 1 到 1500,我只想重命名 100 到 199 之间的文件
我尝试过以下rename
命令
rename -n 's/frame1[\d]{2}_/sprintf("%05d", $&)/e' *.bin
调整我用于其他目的的其他命令,但输出是
frame198_simobject0.bin -> 00000simobject0.bin
frame199_simobject0.bin -> 00000simobject0.bin
我不太明白命令的替换规则是如何工作的,所以这里的一些帮助将非常有用。
答案1
$&
是整个匹配的字符串 - 包括前导frame
和尾随_
。由于这是非数字,因此尝试根据%05d
失败对其进行格式化。
你可能想要类似的东西s/frame(1\d{2})_/sprintf("frame%05d_", $1)/e
前任。
$ rename -n 's/frame(1\d{2})_/sprintf("frame%05d_", $1)/e' *.bin
rename(frame198_simobject0.bin, frame00198_simobject0.bin)
rename(frame199_simobject0.bin, frame00199_simobject0.bin)
请注意,您不需要将字符范围括号括[...]
起来\d
。
答案2
如果您只想重命名文件的子集,一个简单的解决方案是仅通过那些文件到rename
.所以,不要使用*bin
因此,不要使用,大括号扩展,仅选取具有正确名称的文件:
rename -n 's/frame(\d+)_/sprintf("%05d", $1)/e' frame{100..199}_simobject0.bin