最低限 Unix / Linux [II] 【6. 本日の課題】

  1. 事前準備
  1. シェル
  1. テキストエディタ
  1. シェルスクリプト
  1. [付録] データ圧縮・解凍とアーカイブ
  1. 本日の課題
情報実験第 3 回トップへ

本日の課題:シェルスクリプトの作成

本日の実習の内容+αを用いて,大量のファイルの仕分けを行う シェルスクリプトを作成しましょう. 本日の授業では,テキストエディタに vi を使用しましたが, 本課題を作成するうえで,使用するテキストエディタの 指定はありません. Vim,emacs,nano, NeoVim など,好みのエディタを使用してください. Vim を拡張して皆さん好みに改造しても面白いと思います.

注意!この課題中に登場するメールアドレスは実在しません.

課題背景

情報太郎君 (johotaro) 宛のメールは,発火移動大学 (hakudai) の メールサーバ内の,一つのメールボックスファイル Mailbox に, 古いメールから順に連結されて蓄積されている. おや,情報太郎君のメールボックスに大量のメールが溜まって しまったようだ. メールボックスファイルを整理し, 迷惑メールを仕分けて助けてあげよう.

課題データの説明

課題で利用するメールボックスファイルは Mailbox.tar.gz として, 各情報実験機の /kadai に置いてあります.

メールボックスファイルの中身について解説します. Mailbox.tar.gz を解凍して現れるメールボックスファイル Mailbox には,何通ものメールを時系列で古いメールから順に 連結して並べられています. 一通のメールは「ヘッダ」「本文」の2つの 部位に分けられます. メールの区切りは,ヘッダ前半の最初の行 である,「From」という文字列です. 本文中に From で始まる文字列が存在しないことは 確認済みとします.

「ヘッダ」の前半は実際のメールの送り元,宛先などの 情報が含まれており,今回の Mailbox では,「From」 (コロンを含まないことに注意) 「Return-Path:」「Delivered-To:」の行があります. 「From」には,送り主のアドレスと時刻の情報が 格納されています.(例:From hero@XXX.YYY.jp Mon Apr 28 11:22:33 2025)

「ヘッダ」の後半はメーラ (Outlook など) が送り元や宛先, 時刻などを読むための情報が含まれており, 「Date:」「From:」「To:」「Subject:」 の行があります. 今回の課題では「Date:」と「From 」(コロン無し) の行の日時が 一致していることは確認済みです.

「本文」はその名の通りメール本文で,「ヘッダ」の後の 空白行の次の行から,次のメールの「From」までの行が 該当します. 「本文」の行数は当然ながら一意ではありません. 本文の最終行と次のメールの「From」の間には空白行が 一行挿入されます.

「ヘッダ」の「From:」(コロンあり) は送信者が任意に 設定できるため,実際の送り主のアドレスと異なる (= 「From」(コロン無し) と値が異なる) 場合があります. 迷惑メールの多くは 「From:」情報が詐称されています.

これらのメールの書式は,実際のものより簡略化されています. 余裕のある方,興味のある方は是非調べてみてください.

Fig. 1 Mailbox 中のメールの構造図
From inexhanako@joho.hakudai.ac.jp Mon Apr 28 22:29:04 2025 # メールの区切り行.実際のメールの送り主と送信日時が 書かれている
Return-Path: <inexhanako@joho.hakudai.ac.jp>
Delivered-To: johotaro@joho.hakudai.ac.jp
Date: Mon, 28 Apr 2025 22:29:04 +0900 # メーラが読む送信日時.今回の課題では "From " (コロン無し) 行の日時と一致する
From: inexhanako@joho.hakudai.ac.jp # メーラが読む送り主."From " (コロン無し) 行の送り主と必ずしも一致しない
To: johotaro@joho.hakudai.ac.jp # メーラが読む送信先
Subject: How are you # メーラが読む件名

Mail-no # ここから本文
Nakami # ここまで本文

From pasokonasobi@joho.hakudai.ac.jp Mon Apr 28 22:12:19 2025 # ここから次のメール

課題

シェルスクリプトを情報実験機の各自のホームディレクトリで 実行した際に,以下の 6 個の処理を順番に満たすような シェルスクリプト "kadai.sh" を作成してください. (1 から 4 までの処理を必須課題とします.5,6 を満たさなくても 単位取得は可能です.余裕のある方はぜひ 5,6 の処理にも挑戦してみてください.高評価が望めます) 以下,"" に囲まれているディレクトリは Fig. 2 に示されている ディレクトリと同じものとします. シェルスクリプトの実行によって生成されるディレクトリ・ ファイルの配置は下図のとおりです. 下図にないディレクトリやファイルをシェルスクリプト実行中に 一時的に作成しても構いませんが, それらを削除するスクリプトを"kadai.sh"内で記述し, 最終的に下図中のディレクトリ・ファイル だけが残るようにしてください.

Fig. 2 シェルスクリプト実行後のディレクトリ・ ファイルの配置.緑の網掛けはディレクトリ,赤の網掛けは ファイルを表し, hogehoge はユーザー名を表わす.

  1. ホームディレクトリ直下に "work/" ディレクトリを作成する. すでに "work/" ディレクトリが存在する場合は,もともとあった "work/" ディレクトリを削除し,新たな "work/" ディレクトリを作成する.
  2. "work/" 直下に "src/" ディレクトリを作り,/kadai から Mailbox.tar.gz をコピーする.
  3. "work/" 直下に Mailbox.tar.gz を解凍した Mailbox を移動する. Mailbox.tar.gz を解凍する際は次のページを参照せよ: データの圧縮・解凍. また,Mailbox.tar.gz は解凍後も "src/" に残すこと. 普通、tar によるアーカイブは複数のファイルを一つにまとめるために 用いる.今回は解凍後に現れるファイルは Mailbox 一つだけだが、 tar コマンドに慣れてもらうためにアーカイブを使った.
  4. 送り主ごと のメール件数を数え,"work/" 直下の sender.csv に書き出す. その際,送り主として Mailbox の「From」(コロン無し) に 格納されたメールアドレスを用いること. 書式は以下のようにする:
    All,全てのメール件数
    送信者 A のメールアドレス,送信者 A からのメール件数
    送信者 B のメールアドレス,送信者 B からのメール件数
    ...
    一行目には All という文字列の右に, 全てのメール件数の総数を書く. 二行目以降は,メール件数の少ない順に 送信者のメールアドレス (例:hero@XXX.YYY.jp) と その送信者からのメール件数を書いてゆく. 一列目と二列目の間にはコンマ (,) を入れること.
  5. "work/" 直下に "Maildir/" ディレクトリを作る. Mailbox 内のメールを一通につき一つのファイル (古い順に mail0001, mail0002 ... と名付ける) に切り分け, "Maildir/" 直下に置く. ファイル最終行は改行を含めても含めなくても構わない. "work/" 直下の Mailbox の内容は編集しないように注意すること.
  6. "work/" 直下に "SPAM/" ディレクトリを作る. "Maildir/" 直下から,「From」(コロン無し) と「From:」 に格納されたメールアドレス が一致しないメールを選び,そのメールファイルを時系列で spam0001, spam0002, ... とリネームした上で,"SPAM/" 直下へ 移動させる. 迷惑メールを移動させるため,最終的に "Maildir/" 中の ファイル番号は歯抜けになるはずである.

提出内容

以下のものを提出せよ.〆切: 2025年5月14日(水) 正午

ディスカッショントピックの件名には,自分の名前・情報実験機番号を記述すること.

注意点

困ったときは

ヒント




<< 戻る (データ圧縮・解凍とアーカイブ)      次へ >> (付録: gnuplotについて)      情報実験 第 3 回 のトップへ >>

最終更新日: 2025/05/03 山本 峻大 copyright © 2025 inex