Regular-Expression
重命名文件以使用 perl 替換對它們進行排序
我有一組如下文件
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_*