
以下のファイルの名前を一括変更したい:
「02 Disc 01 私の歌.mp3」
に
「ディスク01 マイソング02.mp3」
これを bash で実行するにはどうすればよいですか? すべての数字は 2 桁でフォーマットされていることに注意してください (1 ~ 9 の前に 0 が付きます)
ファイルのリスト:
01 Disc 01 My Song.mp3
02 Disc 01 My Song.mp3
03 Disc 01 My Song.mp3
04 Disc 01 My Song.mp3
05 Disc 01 My Song.mp3
06 Disc 01 My Song.mp3
07 Disc 01 My Song.mp3
08 Disc 01 My Song.mp3
09 Disc 01 My Song.mp3
答え1
私の記憶では、プログラムの Perl 実装を使用できます(パッケージの一部である とrename
呼ばれる別のプログラムがあります )。例 - まず、質問で提示したファイルのリストを再作成しましょう。rename
util-linux
$ touch 0{1..9}\ Disc\ 01\ My\ Song.mp3
$ ls -l
total 0
-rw-r--r-- 1 ja users 0 Mar 30 01:41 01 Disc 01 My Song.mp3
-rw-r--r-- 1 ja users 0 Mar 30 01:41 02 Disc 01 My Song.mp3
-rw-r--r-- 1 ja users 0 Mar 30 01:41 03 Disc 01 My Song.mp3
-rw-r--r-- 1 ja users 0 Mar 30 01:41 04 Disc 01 My Song.mp3
-rw-r--r-- 1 ja users 0 Mar 30 01:41 05 Disc 01 My Song.mp3
-rw-r--r-- 1 ja users 0 Mar 30 01:41 06 Disc 01 My Song.mp3
-rw-r--r-- 1 ja users 0 Mar 30 01:41 07 Disc 01 My Song.mp3
-rw-r--r-- 1 ja users 0 Mar 30 01:41 08 Disc 01 My Song.mp3
-rw-r--r-- 1 ja users 0 Mar 30 01:41 09 Disc 01 My Song.mp3
再度実行してrename
ファイルを一覧表示します::
$ rename 's,([0-9]+) Disc 01 My Song.mp3,Disc 01 My song $1.mp3,' *
$ ls -l
total 0
-rw-r--r-- 1 ja users 0 Mar 30 01:42 Disc 01 My song 01.mp3
-rw-r--r-- 1 ja users 0 Mar 30 01:42 Disc 01 My song 02.mp3
-rw-r--r-- 1 ja users 0 Mar 30 01:42 Disc 01 My song 03.mp3
-rw-r--r-- 1 ja users 0 Mar 30 01:42 Disc 01 My song 04.mp3
-rw-r--r-- 1 ja users 0 Mar 30 01:42 Disc 01 My song 05.mp3
-rw-r--r-- 1 ja users 0 Mar 30 01:42 Disc 01 My song 06.mp3
-rw-r--r-- 1 ja users 0 Mar 30 01:42 Disc 01 My song 07.mp3
-rw-r--r-- 1 ja users 0 Mar 30 01:42 Disc 01 My song 08.mp3
-rw-r--r-- 1 ja users 0 Mar 30 01:42 Disc 01 My song 09.mp3
答え2
これを試すことができます:
for f in *.mp3; do
foo=$(echo "${f%.*} ${f%%[^0-9]*}.mp3")
mv "$f" "${foo#[0-9]* }"
done
その結果は次のようになります:
'Disc 01 My Song 01.mp3'
'Disc 01 My Song 02.mp3'
'Disc 01 My Song 03.mp3'
'Disc 01 My Song 04.mp3'
'Disc 01 My Song 05.mp3'
'Disc 01 My Song 06.mp3'
'Disc 01 My Song 07.mp3'
'Disc 01 My Song 08.mp3'
'Disc 01 My Song 09.mp3'
答え3
bash ソリューション。-a
組み込みのフラグread
とコマンド置換、および here 文字列を使用します。
for f in *.mp3; do
renamed=$(
read -ra var <<< "$f"
printf '%s' "${var[1]} ${var[2]} ${var[3]} ${var[4]%.*} ${var[0]/%/.${var[4]##*.}}"
)
echo mv -v -- "$f" "$renamed"
done
echo
結果に満足したら削除します。