本日の課題:シェルスクリプトの作成
本日の実習の内容+αを用いて, タイムスタンプ(ある出来事が発生した日時・日付・時刻などを示す文字列. 以下のページではファイルの最終更新時刻を意味する)がバラバラなファイルを日時がわかるようにリネームするスクリプトを書きましょう.
課題背景
とある研究室に所属しているM くん(仮名)は性格が超ずぼらなことで有名で, 机の上は書類の山,よく家では靴下などを床に脱ぎっぱなしにしています. もちろん彼のパソコンの中身にもその性格が如実に表れており, せっかくアーカイブした卒論用のパワーポイントのファイルも 命名規則が以下のようにぐちゃぐちゃでどれが最新のものかが 一目では分からない状態です.
ファイル名 | 最終更新時刻 |
---|---|
graduate.pptx | 2011/12/25 17:46 |
graduate02.pptx | 2011/12/28 22:12 |
graduate_new.pptx | 2012/01/04 09:12 |
・ | |
・ | |
・ | |
graduate_kaizen.pptx | 2012/01/15 12:29 |
graduate_happyou.pptx | 2012/01/20 13:00 |
graduate_happyou_last.pptx | 2012/01/24 09:22 |
graduate_happyou_final.pptx | 2012/01/25 13:12 |
graduate_happyou_syuusei.pptx | 2012/02/03 15:04 |
※タイムスタンプ順に並んでいます
※ちなみに発表は2012/01/25 でした
※ファイルは100 個くらいあります
M 君「あー困った. 誰か日付が分かるようにファイルの名前を 変えてくれないかな?|д゚)チラッ」
さぁ,みなさんM 君の悩みを解決する手助けをしてあげましょう!
注1: M 君は架空の人物です. 三上ではありません.
注2: パワーポイントの資料の命名規則は一例です.
決して実際の三上PC 内のファイル名を再現しているわけではありません.
注3: 今回の課題はM 君の悩みを解決するスクリプトを作成するわけではありません.
課題概要
以下のように, あるディレクトリの中には300 個のディレクトリがあり, その下には親ディレクトリと同じ名前のテキストファイルが存在します.
ディレクトリ/テキストファイル 例 |
---|
askso/askso.txt |
chamboa/chamboa.txt |
filham/filham.txt |
sdffg/sdffg.txt |
それらのテキストファイルは1 行だけ文字列が書き込まれています.
テキストファイルの一例(sdffg.txt)
しかしながら, テキストファイルの中には"dummy" とだけ書かれたダミーファイルが存在します.
ダミーファイルの例(askso.txt)
以下では"dummy" と書かれた.txtファイルを「ダミーファイル」(上の例ではaskso.txt), それ以外を「本物のファイル」(上の例ではsdffg.txt)と呼ぶことにします. みなさんには, これらのファイルを仕分けし, ファイル名を見ただけでタイムスタンプ(最終更新時刻)が分かるようにリネームしてもらいます.
ファイル例: sdffg/sdffg.txt
-rw-r--r-- 1 inex inex 77 12月 20 1990 sdffg.txt
リネーム例: sdffg.txt => 19901220.txt
「本物のファイル」をタイムスタンプ順にすべて出力すると, あるアスキーアートが表示されます(アスキーアート(Ascii Art)とは記号などの文字を組み合わせて作成した絵のこと, 顔文字もアスキーアートの一つ).
みなさんには,
- 「ダミーファイル」と「本物のファイル」を仕分けする
- タイムスタンプに従ってリネームする
- 「本物のファイル」をタイムスタンプ順に出力し, アスキーアートを作成する
課題詳細
今回の課題の完成例はこうなります. 参考にしてください. なお, 皆さんにお配りするデータとは別のデータを用いているのでこのままコピペすることはできません.また, アスキーアートが出力されているresult.txt は著作権の関係上閲覧できないようにしています. 以下の仕様をすべて満たすスクリプト(time_rename.sh) を作成してください. また, スクリプトには実行権限を与えてください.
- データは以下のアドレスに tar.gz で圧縮されています. 今回の実習で行った解凍を行ってください(解凍時にタイムスタンプに関するWarning が出ますが無視してよいです. ).
- http://www.ep.sci.hokudai.ac.jp/~inex/y2015/0501/practical/kadaidata/homeworktype1.tar.gz (joho01-joho05 まで)
- http://www.ep.sci.hokudai.ac.jp/~inex/y2015/0501/practical/kadaidata/homeworktype2.tar.gz (joho07-joho11 まで)
- http://www.ep.sci.hokudai.ac.jp/~inex/y2015/0501/practical/kadaidata/homeworktype3.tar.gz (joho13-joho17 まで)
- http://www.ep.sci.hokudai.ac.jp/~inex/y2015/0501/practical/kadaidata/homeworktype4.tar.gz (joho19-joho23 まで)
$ wget http://www.ep.sci.hokudai.ac.jp/~inex/y2015/0501/practical/kadaidata/homeworktype1.tar.gz
- 自分のホームディレクトリ以下の作業ディレクトリ(ex. work ディレクトリ)にダウンロードしたファイルや作業成果を格納してください.
- "kadai/src_dir/" 以下のディレクトリに格納されている「ダミーファイル」は"kadai/dummy_dir" ディレクトリに格納し, そのファイル名はタイムスタンプに合わせて"YYYYMMDD_dummy.txt" としてください. ここで"YYYY" は西暦年(ex. 1990 年=> 1990), "MM" は月(ex. 5 月=> 05), "DD" は日(ex. 1 日=> 01) です. また本来はありえませんが, タイムスタンプが未来のものもあります. これは課題の仕様ですので, 気にしないでください.
- 「ダミーファイル」には検査済みのあかしとして, 一行目の最後に CHECKED を加えてください.
- "kadai/src_dir/" 以下のディレクトリに格納されている「本物のファイル」は"kadai/true_dir" ディレクトリに格納し, そのファイル名はタイムスタンプに合わせて"YYYYMMDD.txt" としてください.
- "kadai/true_dir" ディレクトリに格納したファイルの中身をタイムスタンプ順に"kadai/result.txt" へ出力してください.
- 最後に作成した"kadai/result.txt" と元となるアスキーアート(kadai/src_dir/ascii.txt)とを比較して, 正しくファイルが抽出できているかの確認作業も"time_rename.sh"内に記述してください.
提出内容
以下のものを suu に投稿してください. その際, それぞれ対応するタグに投稿してください.
- 作成したシェルスクリプト全文 (タグ : [2015] 3-1. シェルスクリプト本文)
- 工夫, または苦労した点. (タグ : [2015] 3-2. 課題に関するコメント等)
- 作業協力者がいればその名前, 参考文献(人のレポートを参考にした場合もちゃんと書くこと). (タグ : [2015] 3-2. 課題に関するコメント等)
- その他コメントなど. (タグ :[2015] 3-2. 課題に関するコメント等)
- 「ファイルアップロード」から以下のファイルをアップロードしてください.
- time_rename.sh (スクリプトファイル)
- kadai.tar.gz ("kadai" ディレクトリの圧縮ファイル)
- 圧縮の方法についてはこちら を参照
注意点
- cp などのファイルを移動するコマンドや, vi などのファイルエディタをテキストファイルに適用すると, タイムスタンプが変更され, 適切に課題に取り組むことが出来なくなる可能性があるので注意してください. 課題詳細の最後にあるアスキーアートの出来の確認はタイムスタンプの変更の有無を確認をする一つの手段でもあります.
- 情報実験機で作業する場合には本日の事前準備を参考に x window system を立ち上げる.
困ったときは
- わからないことがあったらまずは文献(過去のレポート含む)あるいはインターネット上の検索エンジンを利用しましょう.
- やっぱりわからないときは友達と相談しましょう.
- どうしてもわからないときは inex2015-ml を活用しましょう. 同じような疑問を持っている人の助けになるかもしれません.
- もちろん直接 TA・VTA をつかまえてもけっこうです(8 号館二階にいると思います).
ヒント
- やり方は一通りではない. どうすれば一番楽か作業の順序立てを最初に考えよう.
- コマンドの使い方が分からなくなったらman で調べよう!
- 沢山のファイルに同じ処理を施すには, メタキャラクタや ループ処理が便利.
- パイプを活用して 複数のコマンドを組み合わせてみよう.
- 一つのコマンドでも コマンドラインオプション によって様々な機能を発揮します. man や www サイトで いろいろ調べてみるべし.
- cat, grep,sed,awk等のよく使われる便利なコマンドを調べてみよう!
- ヒントに囚われず, 自由な発想をしよう!!
<< 戻る (データ圧縮・解凍とアーカイブ) 最初へ >> (実習の前準備) 情報実験 第 3 回 のトップへ >>