|
Contents
1 はじめに 2 一行の中にある世界 3 Awkのうごかしかた 4 短いプログラム 5 プログラム例 6 フォルダの検査 6.1 はじめに 6.2 ファイル情報のみを抽出する 6.3 ファイル名を抽出する 6.4 その他のデータを整形する 6.5 フォルダ検査の結果とまとめ 7 2つのファイルの比較と連想配列 7.1 はじめに 7.2 2つのファイルを読み込む 7.3 連想配列による比較 8 まとめとバッチファイル化 9 おわりに 10 参考文献・サイト |
7.3 連想配列による比較では、実際に比較について考えてみましょう。再度このプログラム目標を示します: フォルダ2の中にあって、フォルダ1に存在しないファイルと、 フォルダ1よりも新しいファイルの情報を出力する ここでは、awkに特徴的な連想配列というものを使って実装していきたいと思います。連想配列とは、[]の中を文字列で指定できる配列で、以下のように使います:
では、実際に使っていきましょう。scan1.tmpおよびscan2.tmpの内容が以下のようになっているとします。
ファイル名をscandir2.awkとして、以下のようなプログラムを作ります。
以下のように実行します。
BEGIN節のFSは、各行を分割する文字列を表します。ここでは、コロン(:)を項目の切れ目に使っていますので、そのように指定します。次に、ARGV[1]で指定したファイルを読んで、ファイル名を[]に使った日付の連想配列を作ります。ARGV[1]はscan1.tmpですから、結局のところ格納されるのはこれだけです:
次の行に移ります。次の行では、scan2.tmpに格納されている各ファイル名について、連想配列fdateの中身を出すように指示されています。fdate ["Dt0304e1.mid"]、fdate["Zephyr Project Web Page. htm]・・・となります。しかし、格納されているのは、先ほどscan1.tmpを読み込んで作られたfdate["Dt0304e1.mid"]=990227だけで、残りは空です。従って、出力結果は以下のようになります:
この方法を使うと、
という情報が得られ、したがってフォルダ1と2の両方にあるファイルを抽出することができます。ファイルが存在しているときだけ何か処理するプログラムを以下に示しておきます。
ファイルがあるかどうかのほか、ファイルがより新しいかどうかも調べなければなりません。とはいえ、前章で日付と時刻を数値になおしましたので、これに基づいて大小を比較するだけです。この2つの手法を使うと、フォルダの中身を比較するプログラムを以下のようになります:
なお、2番目の長いif文の中は最新のファイルかどうかを調べるために、「日付が後」もしくは「日付が同じかつ時間が後」という条件を用いています。 |