stdin がファイルの内容と異なる場合にのみファイルを置き換えます。

stdin がファイルの内容と異なる場合にのみファイルを置き換えます。

stdinファイル名(引数など)を受け入れ、バッファから読み込み、指定したファイルの内容と比較するプログラムを探しています。

内容が異なる場合、プログラムは入力バッファの内容でファイルを(理想的にはアトミックに)上書きします。

それ以外の場合、ファイルは変更されずにそのまま残ります。つまり、書き込みが行われず、最後に変更されたタイムスタンプは変更されず、一時ファイルは生成されません。

使用例:echo "test" | myprogram myfile.txt

このプログラムはユニバーサルUnixコマンドラインツールとして存在しますか?一時ファイルなしでシェルでこれを簡潔に実行するための良い方法はありますか? (rsyncではそうではありません)

ベストアンサー1

#! /bin/bash

TMP_FILE=/tmp/myprogram.$$.tmp
COMP_FILE="$1"

test -f "$COMP_FILE" && test -r "$COMP_FILE" && test -w "$COMP_FILE" || exit 2

cat >"$TMP_FILE"
cmp "$COMP_FILE" "$TMP_FILE" || cp "$TMP_FILE" "$COMP_FILE"
rm "$TMP_FILE"

おすすめ記事