シェルスクリプトポケットリファレンスを使ってコツコツ学習してきたのは、ディレクトリ内にある(一応規則的に名前づけられている)ファイルの一群に、「ディレクトリ名+連番+拡張子」というルールで連番処理を施したかったから。
そして求めている処理を達成できるスクリプトが何とか完成。記述の美しさとかはまた別の問題ですが、自分なりに求めていたものができたのでとても嬉しい!
#!/bin/bash
# カレントディレクトリの取得
dir=`pwd`
#ピリオドの定義
peri=”.”
#ディレクトリ名のみ抽出(パスを取り除く)
dirname=`echo “$dir” | sed ‘s/\/.*\///’`
echo “現在のディレクトリは$dirnameです。”
#ディレクトリ内のファイル数
start=1
end=`find . -type f | wc -l`
echo “ファイル数は$endです。”
#ファイルの数の桁数を取得
keta=`expr length $end`
echo “桁数は$ketaです。”
for file in `ls $dir` ;do
#ファイル名部分を取り出す
filename=`expr $file : ‘^\(.*\.\)’ | sed ‘s/\.//’`
#拡張子を取り出す
kakucho=`expr $file : ‘.*\.\(.*\)’`
echo “ファイル名$filenameを$dirnameに”
echo “拡張子を$kakuchoに変更します。”
#連番の桁数を指定
case “$keta” in
“1”)
id=`printf %d $start` ;;
“2”)
id=`printf %02d $start` ;;
“3”)
id=`printf %03d $start` ;;
esac
#ファイル生成
mv $file $dirname$id$peri$kakucho
start=`expr $start + 1`
done
早速実際に走らせて動作チェックだ〜!
例えばtestディレクトリの中にa.txt、b.txt、cd.txt、efghi.txtというファイルがあったとき、testディレクトリ内で上記スクリプトを走らせると、test1.txt、test2.txt、test3.txt、test4.txtという連番ファイルに置き換えてくれるはず。
ファイルが2桁あればtest01.txt、test02.txt・・・というふうになりますし、3桁であればtest001.txt、test002.txt・・・と連番部分の桁数を合わせてくれます。最も、桁数指定は手動で行なっているため、対応しているのは3桁までなのですが、一つのディレクトリにファイルを1000以上入れるようなことは普通ないですから・・・。
そして実際にテストファイルを作って動作確認してみたところ、想定通りの動作になっています。じゃ実際に処理したいディレクトリにある実データを使ってやってみますか!
というわけで、万が一に備えて実データのあるディレクトリのコピーを別区画に作成し、そこで動作確認。
これでサーバ内のファイル整理を行える〜〜♪なんてルンルンでいたら、実データの動作確認で思わぬところに落とし穴が見つかってしまいました・・・。
落とし穴1:拡張子のないファイルが間にあると(当たり前ですが)拡張子のないファイル名で出力される
落とし穴2:ファイル名に空白があると(空白で分割してしまう?)「statできません: そのようなファイルやディレクトリはありません」というエラーが返され、連番処理が行われない(そのままのファイル名で出力されてしまう)
現実的にはファイルに拡張子を付与していないファイルを扱うことはほとんどない(というか、まずない)ので1はあまり大きな問題ではありません。が、2の方は自分以外の人間がファイルを作成した際に間に空白を入れる可能性は排除しきれず・・・(というか、実際そうだったからこのエラーに気づいた)。
というわけで、引き続きブラッシュアップしないとだめでした!