重命名文件名中已有数字的文件

重命名文件名中已有数字的文件

我有以下名称的文件,从 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-renameperl-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

相关内容