9

これは、さまざまなプラットフォームでの非標準機能の典型的なケースのようです。

簡単に言えば、ファイルの変更時刻を秒単位の UNIX タイムスタンプとして取得するための、普遍的に (または少なくとも広く) サポートされている方法が必要です。

現在、これを行うさまざまな方法を知っていますstatが、ほとんどはプラットフォーム固有のものです。たとえばstat -c %Y $file、一部では機能しますが、代わりに使用する OS X (およびおそらく他の FreeBSD システム) では機能しませんstat -f %m $file

同様に、一部のプラットフォームは をサポートしていますdate -r $file +%sが、OS X/FreeBSD は、このオプションが、他のプラットフォームのような参照ファイル オプションではなく、UNIX タイムスタンプを取得するため-rの代替手段のように見えるため、サポートしていません。+%s

私がよく知っているもう 1 つの方法はfind-printfオプションを使用することですが、これも広くサポートされていません。私が知っている最後の方法は解析ですls。これは、やらなければならないことは不快であるだけでなく、信頼できる (または少なくとも信頼すべき) ものではないと私は信じています。

では、ファイルの変更時刻を取得するためのより互換性のある方法はありますか? 現在、さまざまなバリエーションをstatスクリプトに投入し、ステータスがゼロで終了するまでそれらを実行していますが、成功したコマンドをキャッシュして将来最初に実行したとしても、これは理想とはほど遠いものです。

4

3 に答える 3

7

「正しい」解決策がないように思われるので、比較のために現在の解決策を投稿すると思いました。

if stat -c %Y . >/dev/null 2>&1; then
    get_modified_time() { stat -c %Y "$1" 2>/dev/null; }
elif stat -f %m . >/dev/null 2>&1; then
    get_modified_time() { stat -f %m "$1" 2>/dev/null; }
elif date -r . +%s >/dev/null 2>&1; then
    get_modified_time() { date -r "$1" +%s 2>/dev/null; }
else
    echo 'get_modified_time() is unsupported' >&2
    get_modified_time() { printf '%s' 0; }
fi

[編集] 私が使用しているコードの最新バージョンを反映するようにこれを更新しています。基本的には、現在の作業ディレクトリの変更時刻を取得しようとして、2 つの主要なstat方法とやや一般的な方法をテストします。dateメソッドの 1 つが成功すると、後でスクリプトで使用するためにそれをカプセル化する関数が作成されます。

このメソッドは、呼び出されなくても常に何らかの処理を行うため、投稿した前のメソッドとは異なりますがget_modified_time、ほとんどの場合に呼び出す必要がある場合は、全体的により効率的です。また、サポートされていないプラットフォームを早期にキャッチすることもできます。

呼び出されたときにのみ関数をテストする関数を好む場合は、別の形式を次に示します。

get_modified_time() {
    modified_time=$(stat -c %Y "$1" 2> /dev/null)
    if [ "$?" -ne 0 ]; then
        modified_time=$(stat -f %m "$1" 2> /dev/null)
        if [ "$?" -ne 0 ]; then
            modified_time=$(date -r "$1" +%s 2> /dev/null)
            [ "$?" -ne 0 ] && modified_time=0
        fi
    fi
    echo "$modified_time"
}
于 2013-07-28T10:10:07.320 に答える
0

オペレーティング システムにその名前を尋ねるだけで、そこから移動できます。または、C プログラムを作成するか、Python など、かなり一般的でより標準化されたものを使用します: How to get file creation & modified date/times in Python?

于 2013-07-27T09:06:30.263 に答える