ファイル名にすでに数字があるファイルの名前を変更する

ファイル名にすでに数字があるファイルの名前を変更する

water-frames0.groからwater-frames201.groまで、次の名前のファイルがあります。

water-frames0.gro  water-frames119.gro  water-frames138.gro  water-frames157.gro
water-frames116.gro  water-frames135.gro  water-frames154.gro

端末でファイルが正しくソートされるように、数字の前にゼロとダッシュを追加するにはどうすればよいですか?何千ものファイル名を処理するために必要なので、さらにゼロを追加すると便利です。

新しいファイル名が次のようになると思います。

water-frames-0000.gro  water-frames-0119.gro  water-frames-0138.gro  water- 
frames-0157.gro water-frames-0116.gro  water-frames-0135.gro  water-frames-0154.gro

名前の変更を試してみて、以前の質問を見ましたが、適応できるものが見つかりませんでした。

ありがとう、

答え1

Perlrenameユーティリティを使用してください。

$ rename -n 's/(\d+)(\.gro)$/sprintf "-%04i%s", $1, $2/e' ./*.gro
rename(./water-frames0.gro, ./water-frames-0000.gro)
rename(./water-frames116.gro, ./water-frames-0116.gro)
rename(./water-frames119.gro, ./water-frames-0119.gro)
rename(./water-frames135.gro, ./water-frames-0135.gro)
rename(./water-frames138.gro, ./water-frames-0138.gro)
rename(./water-frames154.gro, ./water-frames-0154.gro)
rename(./water-frames157.gro, ./water-frames-0157.gro)

これは、.groの前の数字を$ 1でキャプチャし、.gro自体を$ 2でキャプチャするため、代替演算子の右側(RHS)で使用できますs////eRHSをPerlコードとして評価するために名前変更を引き起こすPerl正規表現の修飾子です。man perlre詳細より。sprintfリテラルで始まり-、$ 1と$ 2をゼロで埋められた4桁の整数(%04i)と文字列(%s)でフォーマットします。

file-rename注1:Perlの名前変更は、またはとperl-renameも呼ばれますprename。機能とコマンドラインオプションが完全に異なり、互換性のないrenameユーティリティと混同しないでください。util-linux

注2:この-nオプションはテスト実行であるため、実際にファイル名を変更せずに実行するアクションのみを表示します。要件を満たしていることが確認されたら、削除または置換して-n詳細な出力を取得します。-v

注3:perl renameは、ファイル名をコマンドラインまたは標準入力(新しい行またはNULで区切られたファイル名)の引数として使用できます。名前変更オプションは-0パイプ入力によく合いますfind ... -print0。でもうまく機能しますfind ... -exec rename ... {} +

答え2

そしてzsh

autoload -Uz zmv

バッチの名前変更機能の自動読み込み(に最適~/.zshrc

zmv -n '(water-frames)(<0-999>)(.gro)' '$1-${(l[4][0])2}$3'

満足のいくものを削除してください-n

関連情報