締め切りは 6/20。
提出先:
問題は、おもにシェルスクリプトを作ることです。 以下の 19問から何問か選んで解答すること。各問題の後に [1] とか [2] という数字がついていますが、これはその 問題の点数です。 各自、合計が最低でも 5点以上になるように 解答してください。 解答はメールに添付してもらえればいいです。質問は随時受けつけます。
おしらせ (6/17 追加)
Bourne Shell の文法や内部コマンドについて調べたいときは sh の man ページを見てください。ただし、これは機種によって違いがあります。
問題:
ディレクトリ名にスペースが入ることは想定しなくてよい。
引数がまちがっている場合はちゃんと ヘルプを標準エラー出力に表示して、異常終了するようにすること。
(ヒント: 任意個の引数をどうやってサポートするか? シェル内部コマンドの shift を参照)
ディレクトリは複数指定可能で、何も指定されなかったときは カレントディレクトリ以下を対象とする。 find と xargs を使うこと。
(ヒント: 3行で終わる)
rotate_log ログ用ディレクトリ 古いログを残す個数 のように指定したい。 たとえば rotate_log /var/log/syslog 3 とやると /var/log/syslog が空になるが、古い /var/log/syslog の内容は /var/log/syslog-20010529 などに残される。そして 3日以上前の 「/var/log/syslog-なんとか」というディレクトリは消されるようにしたい。
ディレクトリ名にスペースが入ることは想定しなくてよい。
引数がまちがっている場合はちゃんと ヘルプを標準エラー出力に表示して、異常終了するようにすること。
(ヒント: basename, dirname を使おう)
ディレクトリ名にスペースが入ることは想定しなくてよい。
引数がまちがっている場合はちゃんと ヘルプを標準エラー出力に表示して、異常終了するようにすること。
(ヒント: シェル内部コマンドの read を参照)
remove_noaxes_files 3 ~/work ~/tmp
などとやると、~/work と ~/tmp 以下で 3日以上アクセス (読み書き) されていないファイルとディレクトリをすべて削除する。 ほかのコマンドと違って、 ディレクトリがひとつも指定されなかった場合は危険なのでエラー 終了させること。
引数がまちがっている場合はちゃんと ヘルプを標準エラー出力に表示して、異常終了するようにすること。
また、このスクリプトには設計上の手落ちがある。 たとえばファイルを削除でなく特定のフォルダに移動させたい場合は スクリプトを書き換えねばならない。このスクリプトを より一般的に利用できるようにするには、どのように設計を変更すれば よいか議論せよ。
(ヒント: find)
ファイルが複数指定された場合はつねに less を使い、 ファイルの指定がなかった場合には標準入力から入力された内容を less でそのまま表示するようにせよ。 現在の端末に表示できる最大行数は stty size を実行した値を使う。
(ヒント: wc)
(ヒント: find を使うが、自分が読めない条件を全部指定するのは大変だよね)
ファイル名が指定されない場合は、標準入力からテキストファイルが 入力されたものとして扱うこと。
(ヒント: ファイルの拡張子を判定するには case を使います)
以下のように「科目名 点数」の形式のテキストファイル:
を与え、整数 n を与えると、 上位 n 科目の平均点を出力するようなシェルスクリプト calc_avg を書け。 たとえば代数系と符号理論 60 プログラミング第三 99 コンパイラ構成 82 オペレーティングシステム 95 数理計画法 55 ...
% calc_avg 30 mytranscript.txt のようにすると、上位 30位までの点数の平均が表示される。
引数がまちがっている場合はちゃんと ヘルプを標準エラー出力に表示して、異常終了するようにすること。
(ヒント: awk)
どちらのスクリプトも1つのファイル名を引数として与え、 各行ごとに単語名と出現回数およびその順位を出力するようにせよ。 なお、英文における単語の区切りは空白あるいはカンマ、ピリオドで よい。日本語文の場合は形態素解析器として juman と chasen の どちらを使ってもよい (snow には両方入っている)。1形態素 = 1単語と みなすこと。例文はどこかから適当に取ってくること。
引数がまちがっている場合はちゃんと ヘルプを標準エラー出力に表示して、異常終了するようにすること。
(ヒント: 英語なら tr | sort | uniq -c | sort -rn | cat -n)
自然言語処理では、少ないコーパスを使って十分な精度の オープンテストを行うために「クロスバリデーション (cross validation)」 という手法を用いることがある。クロスバリデーションとは、 たとえばほぼ同量のコーパス c1, c2, c3, c4 を持っていたとすると 以下のようにしてテストを行うものである。
% cross_validate train run data1 data2 ... datan
のようにすると、
この実行が終わったときは、data1.train, data1.result, data2.train, data2.result ... というファイルができているはずである。 また、このスクリプトをより使いやすく、より一般的に利用できるように するためにはどんな点を改良する必要があるか議論せよ。
引数がまちがっている場合はちゃんと ヘルプを標準エラー出力に表示して、異常終了するようにすること。
また、このスクリプトには設計上の手落ちがある。 より一般的に利用できるようにするには、どのように設計を変更すれば よいかを議論せよ。
(ヒント: find)
df コマンドは、たとえば % df /home/tanaka などと やると /home/tanaka が含まれているディスクの残り容量を 表示する。これを利用して、
% check_diskfree /home/tanaka 5 euske@cl.cs.titech.ac.jp
などと実行したときに /home/tanaka の残り容量が 5% 以下だったら、 euske@cl.cs.titech.ac.jp に警告メールを送信するように したい。メールの内容には、どこのディレクトリの、いつの時点での 残り容量であるか、およびその割合を含めること。
引数がまちがっている場合はちゃんと ヘルプを標準エラー出力に表示して、異常終了するようにすること。
(ヒント: df の出力を切り出すのは awk を使う、 メールを送信するには /var/qmail/bin/qmail-inject を使うこと)
このような指定された範囲の番号 (連番) がついたファイル名だけを 一括変換するようなシェルスクリプト rename_num を作れ。 たとえば、
% rename_num 001 397 data text .txt のようにすると、data001.txt 〜 data397.txt を それぞれ text001.txt 〜 text397.txt に変換するようにしたい。 ファイル名の一括変換スクリプト remane を作った人は、 これを呼び出すようにしてもよい。
引数がまちがっている場合はちゃんと ヘルプを標準エラー出力に表示して、異常終了するようにすること。
この呼び出し形式は非常に美しくない (一般性がない) ことに 気づくと思う。より一般的な方法で番号つきのファイル名を 操作するには、コマンドのインターフェイスをどのように設計すべきか 議論せよ。
(ヒント: printf というコマンドがある)
ただし、mv と違って扱うのはファイルのみで、 ディレクトリやシンボリックリンクを移動あるいは名称変更する場合は 考えなくてよい。
引数が足りなかったり、ディレクトリを指定された場合は 標準エラー出力にエラーと正しい使い方を表示し、異常終了すること。
(ヒント: ln のマニュアルをよく読んで「ハードリンク」について 学習しましょう)
ファイル名は複数指定可能。 指定されない場合は、標準入力からテキストファイルが 入力されたものとして扱うこと。
(ヒント: tr, sed)
% grepx n file1 file2 ... filen のようにすること。n には前後何行を表示するかの行数を与える。 たとえば n に 1 を与えた場合、このスクリプトはマッチした行を その前後 1行とともに表示する。 (もちろん、通常の grep と同じように、マッチする行が複数存在した 場合はすべてにおいてこうならなければならない)
ファイル名は複数指定可能。 指定されない場合は、標準入力からテキストファイルが 入力されたものとして扱うこと。
(ヒント: cat -n、sed)