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