次のファイルセットがあります
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
以下は実際の例です。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_*
答え2
に変更zsh
:
autoload -Uz zmv
このzmv
機能を自動的にロードします(なるべく~/.zshrc
)。
それから:
zmv -n '(fine_)(<->)(.vtu)' '$1${(l[5][0])2}$3'
(-n
試運転専用)。