2つのファイルの変更日の比較

2つのファイルの変更日の比較

私は普遍的な編集/翻訳システムを作っています。ファイルがコンパイル/変換されたことを確認する1つの方法は、ソースファイルとターゲットファイルの変更日を比較することです。

これを行うには、bashスクリプトを作成する必要があります。

source_file=foo;
target_file=bar;

stat_source=$(stat source_file);
stat_target=$(stat target_file);

しかし、統計出力から日付を抽出して比較するにはどうすればよいですか?statファイルが最後に変更された時期を比較するよりも良い方法はありますか?

ログファイルでstatを呼び出すと、次の結果が表示されます。

16777220 12391188 -rw-r--r-- 1 alexamil staff 0 321 "Jun 22 17:45:53 2017" "Jun 22 17:20:51 2017" "Jun 22 17:20:51 2017" "Jun 22 15:40:19 2017" 4096 8 0 test.log

AFAICT、時間単位は秒以上です。可能であれば、これより細かいものを入手する必要があります。

ベストアンサー1

使っていることを考えるとstattest(同様の機能ですが、BSDとGNUの出力形式は異なります。)直接比較を実行するこのユーティリティを使用することもできます。

   FILE1 -nt FILE2
          FILE1 is newer (modification date) than FILE2

   FILE1 -ot FILE2
          FILE1 is older than FILE2

あなたの例では

if [ "$source_file" -nt "$target_file" ]
then
    printf '%s\n' "$source_file is newer than $target_file"
fi

この機能はPOSIXでは使用できません(該当する内容を参照)。出荷書類ビーチtest)、その理由は次のとおりです。

新しく発明された、またはKornShellからのいくつかの追加の基本コマンドは、条件付きコマンド([[]])の一部として最初の提案に登場しました。 s1 >s2, s1 <s2, str = パターン, str != パターン, f1-ntf2、f1-otf2とf1 -ef f2。条件付きコマンドがシェルから削除されると、shユーティリティの履歴実装に組み込まれているテストユーティリティにまだ含まれていないため、テストユーティリティに送信されません。

ただし、これは将来変更される可能性があります。これは広くサポートされているからです。

オペランドがシンボリックリンクの場合、シンボリックリンクターゲットの修正時間が考慮されることに注意してくださいfind -newer。シンボリックリンクが確認できない場合のインプリメンテーション間の動作間違った解析できないオペランドがある場合)。

また、すべての実装が1秒未満の粒度をサポートするわけではありません(たとえば、バージョン4.4に基づいて「bashs test/組み込み機能はまだサポートされていませんが、GNUおよび/または」組み込み機能は少なくともGNU / Linuxではサポートされています)。[testtestzshksh93

参考までに:

  • GNUtestユーティリティの実装の場合(Bourneのようなシェルには通常これを隠す/組み込みコマンドがfishあるので、バイパスするのではなく使用してください)、test[env testtest時間を取るtest.cで読んでstruct timespec
  • オプション-ntこのデータを使う

おすすめ記事