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"

答え2

私が知っている限り、あなたの要件を満たす既存のツールはありません。次のスクリプトがmyprogram機能するはずです。

#!/bin/bash

var="$(cat)"
md5_stdin=$(echo "$var" | md5sum | cut -d" " -f 1)
md5_file=$(md5sum myfile.txt | cut -d" " -f1)
[[ "$md5_stdin" != "$md5_file" ]] && echo "$var" > myfile.txt

関連情報