本日の課題:シェルスクリプトの作成
本日の実習の内容+αを用いて, 大量 のテキストファイルを一気に仕分けし名前を変更する(リネームする)ためのシェルスクリプトを作成しましょう.
課題背景
随筆家のTさんは新たな作品を作るため, アイディアをテキストファイルに書きためていました. しかし, テキストファイルを整理することには気が回らず, 一つのディレクトリに以下のようにテキストファイルが雑然と存在する状態になっていました.
ファイル名 | 最終更新時刻 |
---|---|
2AF.txt | 2016/03/17 22:00 |
9Sw.txt | 2016/04/18 22:00 |
D2b.txt | 2016/01/23 22:00 |
・ | |
・ | |
・ | |
GEF.txt | 2016/05/24 22:00 |
hxT.txt | 2016/02/29 22:00 |
いざ文章を書こうとしたとき, 書きためていたテキストファイルを整理する必要が出てきました. いつ書いたアイディアなのかすぐに分かるようにするため, ファイル名を見ただけで更新日時(これを以下タイムスタンプという)が分かるように一つ一つリネームしていきました. しかし, 数百とあるテキストファイルを一つ一つ処理するという苦行にTさんの心は折れかけています. 大量のテキストファイルを前に途方に暮れているTさんのため, シェルスクリプトを作成しましょう!
課題概要
みなさんには,
- テキストファイルをタイムスタンプに従ってリネームする
- 段落ごとにファイルを仕分けする
- 各段落の文章を完成させる
- 各段落の文章を統合する
ディレクトリの中に626個のテキストファイルが存在します.
テキストファイル 例 |
---|
23cHR.txt |
29WuW.txt |
それらのテキストファイルには3字の文字列が書き込まれています.
テキストファイルの一例(23cHR.txt)
タイムスタンプを見ることでいつ作成したテキストファイルかを知ることができます.
ファイル例: 23cHR.txt
-rw-r--r-- 1 inex inex 77 2016-02-17 03:26 23cHR.txt
ファイルをタイムスタンプ順に全て出力すると, ある文章ができあがります.
また, いくつかのファイルには, 段落の終わりを示すEがファイルの末尾に含まれています.
Eが含まれているテキストファイルの一例(4p3.txt)
以下にもう少し詳しい説明を書きます.
スクリプトの仕様
以下の仕様をすべて満たすスクリプト(essay.sh) を作成せよ. スクリプトはホームディレクトリ直下に格納し,スクリプトには実行権限を与えること.
- 自分のホームディレクトリ直下に作業ディレクトリ(ex. work ディレクトリ)を作成する.作業ディレクトリ以下にダウンロードしたファイルや作業成果を格納する.
- 以下のアドレスにある tar.gz ファイルをダウンロードし解凍する.
アドレスからダウンロードするには以下のコマンドを使う.$ wget http://www.ep.sci.hokudai.ac.jp/~inex/y2017/0428/practical/kadaidata/essay.tar.gz
- 解凍してできた"essay/file/"以下に格納されている全てのテキストファイルの名前をそれぞれのタイムスタンプに合わせて"YYYYMMDD.txt"に変える. ここで"YYYY" は西暦年(ex. 1990 年=> 1990), "MM" は月(ex. 5 月=> 05), "DD" は日(ex. 1 日=> 01) を表す.
- 3で作ったファイルを段落ごとに異なるディレクトリに仕分けする. ファイルを格納するディレクトリを"essay/"以下に作成し, ディレクトリの名前は順番に"essay/para01, essay/para02,.."とする.
- 各段落のファイルをタイムスタンプ順につなぎ合わせたファイル"essay/para01.txt, essay/para02.txt,.."を作成する. 一行あたり30文字にすること. 段落の最後を表す"E"は削除すること.
- 5で作ったファイルをつなぎ合わせて"essay/result.txt"を作成する. ただし, 段落間には空行を一行入れる.
- 6で作った"essay/result.txt"を"essay/kaitou/essay1.txt", "essay/kaitou/essay2.txt", "essay/kaitou/essay3.txt"と比較し, 正しく作成されているか判定する. essay1, essay2, essay3のいずれかが正解です.
提出内容
以下のものを suu に投稿してください. その際, それぞれ対応するタグに投稿してください.
- シェルスクリプト(タグ : [2017] 3-1. シェルスクリプト本文)
- 作成したシェルスクリプトessay.sh の全文
- 課題に関するコメント (タグ : [2017] 3-2. 課題に関するコメント)
- ファイルを統合することで完成した文章を読み, そこで述べられていることに対する意見を述べよ.
- 工夫,または苦労した点.
- 作業協力者がいればその名前, 参考文献(人のレポートを参考にした場合もしっかり挙げること).
- もし他に言いたいことがあれば記述しても良い.
- 「ファイルアップロード」から以下のファイルをアップロードし,このタグのレポートにリンクを貼ってください.
- essay.sh (スクリプトファイル)
- essay.tar.gz ("essay"ディレクトリの圧縮ファイル)
注意点
- cp などのファイルを移動するコマンドや, vi などのファイルエディタをテキストファイルに適用すると, タイムスタンプが変更され, 適切に課題に取り組むことが出来なくなる可能性があるので注意してください. 誤ってデータファイルのタイムスタンプを変えてしまった場合, データファイルを取り直してやり直してください.
- 情報実験機で作業する場合には本日の事前準備を参考に x window system を立ち上げる.
困ったときは
- わからないことがあったらまずは文献(過去のレポート含む)あるいはインターネット上の検索エンジンを利用しましょう.
- やっぱりわからないときは友達と相談しましょう.
- どうしてもわからないときは inex2017-ml を活用しましょう. 同じような疑問を持っている人の助けになるかもしれません.
- もちろん直接 TA・VTA をつかまえてもけっこうです(8 号館二階にいると思います).
ヒント
- やり方は一通りではない. どうすれば一番楽か作業の順序立てを最初に考えよう.
- コマンドの使い方が分からなくなったらman で調べよう!
- 沢山のファイルに同じ処理を施すには, メタキャラクタや ループ処理が便利.
- パイプを活用して 複数のコマンドを組み合わせてみよう.
- 一つのコマンドでも コマンドラインオプション によって様々な機能を発揮します. man や www サイトで いろいろ調べてみるべし.
- cat, grep,sed,awk等のよく使われる便利なコマンドを調べてみよう!
- ヒントに囚われず, 自由な発想をしよう!!
<< 戻る (データ圧縮・解凍とアーカイブ) 最初へ >> (実習の前準備) 情報実験 第 3 回 のトップへ >>