Regular-Expression

重命名文件以使用 perl 替換對它們進行排序

  • May 24, 2022

我有一組如下文件

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

我想添加填充 0 以便能夠對它們進行排序並渲染它們

我正在嘗試這個命令

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

但它沒有顯示任何東西。我應該如何修改命令以查看新命名然後應用它?

這實際上取決於rename您擁有的版本。這是我的版本報告的內容:

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

但是請注意,許多系統上的預設rename命令util-linux是軟體包中的版本,而不是那個perl

但是,假設您確實有(有時稱為)的perl版本,這裡有一個工作範例:rename``prename

$ 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_*

引用自:https://unix.stackexchange.com/questions/703673