フォルダ全体のコンテンツの名前を変更する

フォルダ全体のコンテンツの名前を変更する

私は OSX 10.9.2 (BASH 3.5) を使っていますが、フォルダ全体のコンテンツ名を変更したいと考えていました。そこでスクリプトを実行したところ、どういうわけか次のようになりました:

s01eDavid.Letterman.2014.02.27.Stupid.Human.Tricks.x264-SWOLLED.mp4
s01eDavid.Letterman.2014.03.07.Lenny.Marcus.HDTV.x264-BATV.mp4
s01eDavid.Letterman.2014.03.24.Jimmy.Carter.HDTV.x264-SWOLLED.mp4
s01eDavid.Letterman.2014.03.25.Emma.Watson.720p.HDTV.x264-SWOLLED.mkv

(各文の冒頭に余分な S01e がありますが、本来は S01e01、S01e02 があるはずでした.....)

これらのファイルを削除/名前変更して、そのようにするにはどうすればよいでしょうか?

s01e1 David.Letterman.2014.02.27.Stupid.Human.Tricks.x264-SWOLLED.mp4
s01e2 David.Letterman.2014.03.07.Lenny.Marcus.HDTV.x264-BATV.mp4
s01e3 David.Letterman.2014.03.24.Jimmy.Carter.HDTV.x264-SWOLLED.mp4
s01e4 David.Letterman.2014.03.25.Emma.Watson.720p.HDTV.x264-SWOLLED.mkv

ありがとう!

答え1

解決策ではありませんawk:

cnt=1
for f in *; do 
  fcnt=$(printf "%02d" $cnt)
  echo mv "$f" "$(echo $f | sed -e "s/^s01e/&$fcnt /")"
  cnt=$(($cnt+1)); 
done

printf コマンドを使用してエピソード番号を 2 桁にしました。

これは単にコマンドを stdout に出力するだけなので、出力が適切かどうかを確認できます。実際に名前を変更する場合は、4 行目の先頭の「echo」を削除します。

答え2

episode=1
for x in s01e*; do
  mv "$x" "s01e$episode ${x#s01e}"
  episode=$((episode+1))
done

エピソードが 10 個以上ある場合は、9 までの数字の先頭に 0 を付けることをお勧めします。これを行う簡単な方法は、100 ~ 199 の範囲の数字を生成し、先頭の 1 桁を削除することです。

episode=101
for x in s01e*; do
  mv "$x" "s01e${episode#1} ${x#s01e}"
  episode=$((episode+1))
done

関連情報