我有以下名称的文件,从 water-frames0.gro 开始到 water-frames201.gro
water-frames0.gro water-frames119.gro water-frames138.gro water-frames157.gro
water-frames116.gro water-frames135.gro water-frames154.gro
如何在数字前添加前导零和破折号,以便文件在终端上正确排序?我需要它来处理数千个文件名,所以我想添加一些额外的零是有用的。
我想象新的文件名是这样的
water-frames-0000.gro water-frames-0119.gro water-frames-0138.gro water-
frames-0157.gro water-frames-0116.gro water-frames-0135.gro water-frames-0154.gro
我尝试使用重命名并查看之前的问题,但是,我找不到可以适应的东西。
谢谢你,
答案1
使用 perlrename
实用程序:
$ rename -n 's/(\d+)(\.gro)$/sprintf "-%04i%s", $1, $2/e' ./*.gro
rename(./water-frames0.gro, ./water-frames-0000.gro)
rename(./water-frames116.gro, ./water-frames-0116.gro)
rename(./water-frames119.gro, ./water-frames-0119.gro)
rename(./water-frames135.gro, ./water-frames-0135.gro)
rename(./water-frames138.gro, ./water-frames-0138.gro)
rename(./water-frames154.gro, ./water-frames-0154.gro)
rename(./water-frames157.gro, ./water-frames-0157.gro)
这会将 .gro 之前的数字捕获为 $1,将 .gro 本身捕获为 $2,因此它们可以用于替换运算符的右侧 (RHS) s///
。 perl 正则表达式的修饰符/e
会导致 rename 将 RHS 计算为 perl 代码。man perlre
详情请参阅。sprintf
以文字开头,-
并将 $1 和 $2 格式化为 4 位零填充整数 ( %04i
) 和字符串 ( %s
)。
注 1:perl rename 也称为file-rename
、perl-rename
、 或prename
。不要与具有完全不同且不兼容的功能和命令行选项rename
的实用程序混淆。util-linux
注 2:该-n
选项使其成为一次试运行,因此它只会显示它将执行的操作,而不会实际重命名任何文件。当您确认它符合您的要求后,请删除-n
,或将其替换为 以获得详细输出。-v
注 3:perl rename 可以将文件名作为来自命令行或标准输入的参数(作为换行符或 NUL 分隔的文件名)。 rename 的-0
选项与通过管道传输的输入很好地配对find ... -print0
。它也可以很好地与find ... -exec rename ... {} +
.
答案2
和zsh
:
autoload -Uz zmv
自动加载批量重命名功能(最好在~/.zshrc
)
zmv -n '(water-frames)(<0-999>)(.gro)' '$1-${(l[4][0])2}$3'
高兴的时候就删掉-n
。