授業時間内に課題を提出してもらう。
ホームディレクトリの下のunixディレクトリに kadai1.shという名前でシェルスクリプトを作り、 以下の様に実行するとファイル名の前半部分が 1番目の引数と同じファイルを全て2番目の引数の名前に変更するようにせよ。
% ls *.iff tmp.1.iff tmp.2.iff tmp.3.iff % csh kadai1.sh tmp test % ls *.iff test.1.iff test.2.iff test.3.iff % mv test.1.iff test.4.iff % mv test.2.iff test.5.iff % mv test.3.iff test.6.iff % ls *.iff test.4.iff test.5.iff test.6.iff % csh kadai1.sh test kadai % ls *.iff kadai.4.iff kadai.5.iff kadai.6.iff % mv kadai.6.iff kadai.7.iff % ls *.iff kadai.4.iff kadai.5.iff kadai.7.iff % csh kadai1.sh kadai samp % ls *.iff samp.4.iff samp.5.iff samp.7.iff
一番、素直な解答は以下のようなものだろう。
変数の修飾という機能を使っているのがポイント。
foreach f ($argv[1].*.iff)
set n1 = $f:r
set n2 = $n1:e
mv $f $argv[2].$n2.iff
end
このスクリプトをもっと短くすると以下のようになる。
foreach f ($argv[1].*.iff)
mv $f $argv[2].$f:r:e.iff
end
課題の条件ではファイルの個数に制限が無いということになっているが、 現実には十分大きな番号まで調べれば実用上問題は無いので以下のようなスクリプトでもかまわない。
set i = 0
while($i <= 10000)
if(-f $argv[1].$i.iff) then
mv $argv[1].$i.iff $argv[2].$i.iff
endif
@ i ++
end
もし、1行で実行しようとすれば以下のようになる。
eval `ls $argv[1].*.iff | sed 's/'$argv[1]'.\([0-9][0-9]*\).iff/mv '$argv[1]'.\1.iff '$argv[2]'.\1.iff;/g'`
これは、あくまでも、こういうこともできるという例なので、ふつうはここまでやることはない。