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コマンド多くのシステムでは、パッケージのバージョンは1つでは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試運転専用)。

関連情報