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///
。/e
RHSを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
。