ディレクトリ内のデタラメな *.jpg と *.jpeg ファイルをこんな感じでまとめてリネーム。


$ ls
aaa.txt		asdf.jpg	poiuy.jpg	qwer.jpg	sngk38.jpeg
 
$ i=1; for f in *.jpg *.jpeg; do g=000$i.jpg; mv $f hoge_${g:(-8)}; i=$((i+1)); done
 
$ ls
aaa.txt		hoge_0001.jpg	hoge_0002.jpg	hoge_0003.jpg	hoge_0004.jpg

ナンバリングの処理は、数値演算構文の $((数値演算式)) を利用して i=$((i+1)) という記述で i を数値としてインクリメント。

リネーム後ファイル名の生成部分は、g=000$i.jpg と ${g:(-8)} の部分。

g=000$i.jpg で、4桁にするために i が最小値1のときに0でパディングするような書き方。
数値が i=10 以上の2桁になっても大丈夫なように、文字列の後ろから8文字分だけをファイル名として扱うようにしている。

${g:(-8)} が、文字列の置換演算子(substr, substring的な処理)で後ろから8文字抜き出す処理。
0001.jpg => これの後ろから8文字を抜き出して => 0001.jpg
00010.jpg => これの後ろから8文字を抜き出して => 0010.jpg
その後、プレフィックスとして今回は hoge_ という文字列をつなげている。

環境: Mac OS X Lion


$ sh --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11)
Copyright (C) 2007 Free Software Foundation, Inc.
 
$ uname -mvsr
Darwin 11.0.1 Darwin Kernel Version 11.0.1: Wed Jun 29 19:53:22 PDT 2011; root:xnu-1699.23.2~1/RELEASE_X86_64 x86_64

tags: bash

Posted by NI-Lab. (@nilab)