私は普遍的な編集/翻訳システムを作っています。ファイルがコンパイル/変換されたことを確認する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
使っていることを考えるとstat
test
(同様の機能ですが、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-nt
f2、f1-ot
f2とf1 -ef f2。条件付きコマンドがシェルから削除されると、shユーティリティの履歴実装に組み込まれているテストユーティリティにまだ含まれていないため、テストユーティリティに送信されません。
ただし、これは将来変更される可能性があります。これは広くサポートされているからです。
オペランドがシンボリックリンクの場合、シンボリックリンクターゲットの修正時間が考慮されることに注意してくださいfind -newer
。シンボリックリンクが確認できない場合のインプリメンテーション間の動作間違った解析できないオペランドがある場合)。
また、すべての実装が1秒未満の粒度をサポートするわけではありません(たとえば、バージョン4.4に基づいて「bash
s test
/組み込み機能はまだサポートされていませんが、GNUおよび/または」組み込み機能は少なくともGNU / Linuxではサポートされています)。[
test
test
zsh
ksh93
参考までに: