数字を挿入して複数のファイルの名前を変更する方法

数字を挿入して複数のファイルの名前を変更する方法

次のファイルのリストがあります。

pairs10_10.mp3
pairs10_11.mp3
pairs10_12.mp3
pairs10_13.mp3
pairs10_14.mp3
pairs10_15.mp3
pairs10_16.mp3
pairs10_17.mp3
pairs10_18.mp3
pairs10_19.mp3
pairs10_1.mp3
pairs10_2.mp3
pairs10_3.mp3
pairs10_4.mp3
pairs10_5.mp3
pairs10_6.mp3
pairs10_7.mp3
pairs10_8.mp3
pairs10_9.mp3
pairs1_10.mp3

後でソートするときに正しい順序でソートされるように、次のようなものを取得したいと思います。

pairs10_10.mp3
pairs10_11.mp3
pairs10_12.mp3
pairs10_13.mp3
pairs10_14.mp3
pairs10_15.mp3
pairs10_16.mp3
pairs10_17.mp3
pairs10_18.mp3
pairs10_19.mp3
pairs10_01.mp3
pairs10_02.mp3
pairs10_03.mp3
pairs10_04.mp3
pairs10_05.mp3
pairs10_06.mp3
pairs10_07.mp3
pairs10_08.mp3
pairs10_09.mp3
pairs01_10.mp3

私はコマンドについて学びましたrenameが、この名前を変更する方法がわかりません。

答え1

Perlrenameコマンドを使用します。

rename 's/([0-9]+)_([0-9]+)/sprintf("%02d_%02d",$1,$2)/e' *.mp3

修飾子es代替演算子置換が補間された文字列ではなくPerl式であることを意味します。%02d関数形式sprintf必要に応じて、先頭にゼロを追加して、2桁の数字のみで整数形式を指定します。


または、zshとそのエントリを使用してください。numeric_glob_sortオプション。ただし、zshがグローブ操作を実行している場合にのみ機能します(図を参照play pairs*.mp3)。

答え2

POSIX:

for f in *;do x=${f#pairs};y=${f#*_};mv $f pairs_$(printf %02d_%02d ${x%_*} ${y%.mp3}).mp3;done

ジシュ語:

autoload zmv;zmv 'pairs(*)_(*).mp3' 'pairs${(l:2::0:)1}_${(l:2::0:)2}.mp3'

答え3

結局、名前変更コマンドで多段階プロセスを使用するようになりました。おそらく、次のように単純化できます。

rename 's/(pairs)([0-9])_/$1Z$2_/' *.mp3
rename 's/(_)([0-9])\./$1Z$2\./' *.mp3
rename 's/Z/0/' *.mp3
rename 's/Z/0/' *.mp3

($1と$2は最初の部分の括弧を参照)

(「0」は「$1」と混同される可能性があるため、「Z」はプレースホルダーにすぎません。)

アイデアは以下から出てくるhttps://unix.stackexchange.com/a/147912/86521

関連情報