SCSH(Scheme Shell)スクリプト入門Beginner's Guide(3/5 ページ)

» 2008年05月27日 15時00分 公開
[Rudolf-Olah,Open Tech Press]
SourceForge.JP Magazine

ファイルを日時に基づいてソートする

 次に紹介する実用的な例は、最近更新されたファイルをソートして表示するためのスクリプトだ。


#!/usr/bin/scsh \
-o sort -s
!#

(define (new-date day month year)   (make-date 0 0 0 day (- month 1) (- year 1900))) (define older-than? <=) (define newer-than? >=) (define (date-is comparison-proc day month year)   (lambda (f) (comparison-proc (file-last-mod f)                    (time (new-date day month year)))))
(define (sort-by-date filter-proc filenames)   (sort-list (filter filter-proc filenames)          (lambda (a b) (older-than? (file-last-mod a)                     (file-last-mod b)))))
(define (display-filename/date filename)   (format #t "~a - ~a~%"       (format-date "~d ~B ~Y" (date (file-last-mod filename))) filename))
(for-each display-filename/date       (sort-by-date (date-is newer-than? 21 4 2008)             (directory-files)))

 最初の行はやはりシェバング行だ。2行目は、scshの実行ファイルに渡されるコマンドライン引数だ。

 続く行では、日付/時刻オブジェクトを作成するための関数を定義しているのだが、SCSHがそれらを作成する通常のやり方に変わった特長があることを考慮している(月のパラメータは0から11までの範囲でなければならず、年のパラメータはその年から1900年を引いた値)。その次の2行では、以上/以下を比較する関数の別名としてolder-than?とnewer-than?を定義している。関数date-isは、ファイル名fのファイルの変更時刻をdate-isに与えられた日/月/年と比較する比較関数を使用した匿名関数を返す。このようにしておくと、sort-by-dateの呼び出しが読みやすくなるという利点がある。例えば「date-is newer-than 2 1 2008」はファイルの更新時刻が2008年1月2日よりも後の場合に真を返す関数を返すことになる。その次の行では、ファイル名の文字列のフィルタ/ソート済みのリストを返すsort-by-date関数を定義している。

 次に、関数display-filename/dateを定義し、その後その関数を使ってソートされたファイル名を表示する。なお関数display-filename/dateでは、ファイル名と日付の表示の仕方を決めている。前記の場合は「日 月 年」の後にファイル名が表示される。

Copyright © 2010 OSDN Corporation, All Rights Reserved.

注目のテーマ