使用 perl 替换重命名文件以对其进行排序

使用 perl 替换重命名文件以对其进行排序

我有一组如下文件

fine_0.vtu
fine_10.vtu
fine_4032.vtu
...

我想添加填充 0 以便能够对它们进行排序并渲染它们

我正在尝试这个命令

rename -n 's/fine_(\d+).vtu/sprintf("%05d", $1)/e' fine*.vtu

但它没有显示任何东西。我应该如何修改命令以查看新命名然后应用它?

答案1

rename这实际上取决于您所拥有的版本。这是我的版本报告的内容:

rename
Usage: rename [-v] [-n] [-f] perlexpr [filenames]

但请注意,默认rename命令在许多系统上是软件包中的版本util-linux,而这不是perl一个。

但是,假设您确实有(有时称为)perl的版本,这里有一个有效的示例:renameprename

$ touch  fine_{0..99}.vtu

$ ls
fine_0.vtu   fine_24.vtu  fine_4.vtu   fine_55.vtu  fine_70.vtu fine_86.vtu
fine_1.vtu   fine_25.vtu  fine_40.vtu  fine_56.vtu  fine_71.vtu  fine_87.vtu
fine_10.vtu  fine_26.vtu  fine_41.vtu  fine_57.vtu  fine_72.vtu  fine_88.vtu
...          ...          ...          ...          ...

$ rename -n 's/^(.*_)(\d+)(\..*)/sprintf "%s%05d%s", $1, $2, $3/e' fine*
fine_0.vtu renamed as fine_00000.vtu
fine_1.vtu renamed as fine_00001.vtu
fine_10.vtu renamed as fine_00010.vtu
fine_11.vtu renamed as fine_00011.vtu
...

$ rm fine_{0..99}.vtu    # or: rm fine_?????.vtu

请记住将其删除-n或替换为-v允许该工具影响选定的文件。

毕竟,如果你没有,你可以直接[p]rename重新实现它的一个版本perl

perl -MFile::Copy -e '
    foreach $f (@ARGV) {
        ($t = $f) =~ s/^(.*_)(\d+)(\..*)/sprintf "%s%05d%s", $1, $2, $3/e;
        warn sprintf("%s -> %s\n", $f, $t);
        move($f, $t);
    }
' fine_*

答案2

改为zsh

autoload -Uz zmv

自动加载该zmv函数(最好在~/.zshrc)。

然后:

zmv -n '(fine_)(<->)(.vtu)' '$1${(l[5][0])2}$3'

-n用于试运行)。

相关内容