🎄 18/25. 使用 Raku 重命名文件
— 焉知非鱼欢迎来到Raku One-Liner Advent Calendar的第18天!今天,将会有一个真正的单行程序,在某种意义上说,你要作为一个运维从终端中运行它。
我们的任务是重命名命令行参数中传递的所有文件,并以偏爱的格式提供文件序列号。以下是命令行的示例:
$ raku rename.pl * .jpg img_0000.jpg
在此示例中,当前目录中的所有图像文件将重命名为img_0001.jpg,img_0002.jpg等。
这是 Raku 中可能的解决方案:
@*ARGS[0..*-2].sort.map: *.Str.IO.rename(++@*ARGS[*-1])
预定义的动态变量@*ARGS
包含命令行中的参数。在上面的示例中,shell 将 *.jpg 掩码展开到文件列表中,因此数组中包含所有这些掩码。最后一个元素是重命名样本 img_0000.jpg。
请注意,与 Perl 5 不同,该变量称为 ARGS,而不是 ARGV。
为了遍历所有文件(并使用文件掩码跳过最后一个文件项),我们正在进行@*ARGS
的切片。0..*-2
结构创建了索引范围以接收除了最后一个元素的所有元素。
然后对列表进行排序(原始的@*ARGS
数组保持不变),我们使用map
方法迭代文件名 。
map
主体包含一个WhateveCode块 ; 它接受当前值的字符串表示形式,从中生成一个IO::Path
对象,并调用 rename
方法。请注意,IO
方法创建IO::Path
类的对象; 而裸 IO
是Raku对象系统层次结构中的一个角色。
最后,增量运算符++
更改重命名样本(保存在@*ARGS
中的最后一个, 即 *-1
元素)。当操作符应用于字符串时,它会增加它的数字部分,因此我们得到 img_0001.jpg,img_0002.jpg等。
我希望 Raku 不会被称为 star-noise 语言 🙂 。尽管如此,明天还会有另一篇关于 Raku 的短篇小文!