組み込みtest
およびユーティリティは、シェルがシステムで「POSIXモード」(同じ名前の外部ユーティリティの場合でも同じ)で実行されている場合でも、ほとんど[
のシェルで-nt
(「最新」)および(「古い」)テストを持ちます. -ot
)にアクセスできます。このテストは、2つのファイルの修正タイムスタンプを比較します。それらが文書化する意味は実装ごとにわずかに異なりますが(1つまたは他のファイルが存在するか存在しない場合に発生することについて)、含まれません。POSIX仕様。test
公共施設のため。
条件付きコマンドが[KornShell]シェルから削除された場合、ユーティリティ履歴の実装に組み込まれているユーティリティには
test
まだ含まれていないため、ユーティリティに転送されません。test
sh
/bin/sh
以下のように、シェルスクリプトのファイル間の修正タイムスタンプを比較し、あるファイルが他のファイルより最新であるかどうかに応じてアクションを取るとします。
if [ "$sigfile" -nt "$timestamp" ] ||
[ "$sigfile.tmp" -nt "$timestamp" ]
then
return
fi
... make
(これはスクリプトの残りの部分が扱いにくくなることを除いて)どのような他のユーティリティを使用できますか?それとも誰も「歴史的実装」に対してスクリプトを実行しないと仮定する必要がありますか?sh
それとも、1つをあきらめる必要がありますか?特定シェルのようなbash
?
ベストアンサー1
フロント:
f1=/path/to/file_1
f2=/path/to/file_2
if [ -n "$(find -L "$f1" -prune -newer "$f2")" ]; then
printf '%s is newer than %s\n' "$f1" "$f2"
fi
ファイルへの絶対パスを使用すると、ファイル名に改行のみを含む偽の肯定が防止されます。
相対パスを使用している場合は、find
コマンドを次に変更します。
find -L "$f1" -prune -newer "$f2" -exec echo . \;