課題1

課題1の説明

授業時間内に課題を提出してもらう。

課題

ホームディレクトリの下の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を使った解答例

一番、素直な解答は以下のようなものだろう。
変数の修飾という機能を使っているのがポイント。

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

whileを使った解答例

課題の条件ではファイルの個数に制限が無いということになっているが、 現実には十分大きな番号まで調べれば実用上問題は無いので以下のようなスクリプトでもかまわない。

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'`

これは、あくまでも、こういうこともできるという例なので、ふつうはここまでやることはない。


Prev | Next
Home | Contents
abe@injapan.net