次のファイルのリストがあります。
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
修飾子e
はs
代替演算子置換が補間された文字列ではなく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