最終課題

最終課題の説明

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

課題

ホームディレクトリの下のunixディレクトリに
kadai.shという名前でシェルスクリプトを作り、
画像ファイル名の前半部分と番号の種類を変換できるようにせよ。

実行例

% ls *.iff
tmp.1.iff tmp.2.iff tmp.3.iff tmp.4.iff tmp.5.iff
kadai.0006.iff kadai.0007.iff kadai.0009.iff kadai.0010.iff
% csh kadai.sh -4 tmp test
% ls *.iff
test.0001.iff test.0002.iff test.0003.iff test.0004.iff test.0005.iff
kadai.0006.iff kadai.0007.iff kadai.0009.iff kadai.0010.iff
% csh kadai.sh -1 kadai tmp
% ls *.iff
test.0001.iff test.0002.iff test.0003.iff test.0004.iff test.0005.iff
tmp.6.iff tmp.7.iff tmp.9.iff tmp.10.iff

解答例

whileを使った解答例。

4桁の番号を変換するのでwhileによって10000まで調べれば良い。

set i = 1
while($i < 10000)
	if($i < 10) then
		set n = 000$i
	else if($i < 100) then
		set n = 00$i
	else if($i < 1000) then
		set n = 0$i
	else if($i < 10000) then
		set n = $i
	endif
	if($argv[1] == -1 && -f $argv[2].$n.iff) then
		mv $argv[2].$n.iff $argv[3].$i.iff
	else if($argv[1] == -4 && -f $argv[2].$i.iff) then
		mv $argv[2].$i.iff $argv[3].$n.iff
	endif
	@ i ++
end

foreachを使った解答例。

printf コマンドを使用すると0の付いた数字を8進数として処理してしまうのでsedコマンドで最初の0を取っている。

foreach f ($argv[2].*.iff)
	set i = $f:r:e
	if($argv[1] == -1) then
		set i = `echo $i | sed 's/^00*//'`
		mv $f $argv[3].`printf "%d" $i`.iff
	else if($argv[1] == -4) then
		mv $f $argv[3].`printf "%04d" $i`.iff
	endif
end

参考にならない解答例。

find を使って1行で実行したもの。

find . -name "$argv[2].*.iff" -exec csh -c 'set f = {} ; set i = `echo $f:r:e | sed "s/^00*//"` ; set d = `echo '$argv[1]' | sed "s/-//"` ; mv $f '$argv[3]'.`printf "%0"$d"d" $i`.iff' \;

Prev
Home | Contents
abe@injapan.net