何秒前に触ったファイルなのか?

秒指定 awk --full-time - まさぶログからですが、ファイルが何秒前に作られたものなのか知りたいことは多く、散在しているファイルから最新のものを取得するようなケースにも使えます。 ここでは 10 秒より前に作られたかどうかを調べるものを作ります。

多くの書籍で ls の出力を用いているものを見かけますが、ls は配布されている配布元が手を入れているケースがあります。 そこで、ここでは stat コマンドを使います。 もっとも stat コマンドも出力方法が様々で異なる可能性もありますので、自分の持っている stat コマンドの出力を確認してください。

stat コマンドに書式を設定することで、エポック時間からの経過秒数で時間を得ることができるようになります。 こうしておくことで後の計算が四則演算のみで行えるようになります。

秒指定 awk --full-time - まさぶログのコメントに書きましたが以下のようにして 10 秒以前に触ったファイルを出力できます。

$ stat --format='%Y %n' * | gawk -v time=10 'systime() - $1 > time {print $2}'

少し応用がきくように awk のみで記述してみます。

#! /usr/bin/gawk -f
# atime.awk

BEGIN {
    stat_cmd  = "/usr/bin/stat";
    stat_opt  = "--format='%Y %n'";
    stat_exec = stat_cmd " " stat_opt;
    for (i = 1; i < ARGC; i++) {
        stat_exec = stat_exec " " ARGV[i];
    }

    atime = 10;

    while (stat_exec | getline > 0) {
        if ($1 + atime < systime()) {
            print $2 " is old.";
        } else {
            print $2 " is not old.";
        }
    }
    close(stat_exec);
}

実行してみましょう。

$ gawk -f atime.awk *
atime.awk is not old.
atime.awk~ is old.

つまり、atime.awk は編集されたファイルなので新しく、atime.awk~ はバックアップファイルなので古いものになっています。

10 秒後に再度実行してみます。

$ gawk -f atime.awk *
atime.awk is old.
atime.awk~ is old.

両者とも古くなりました。

tag_gawk.pngtag_gawk.png