当且仅当 stdin 与文件内容不同时才替换文件

当且仅当 stdin 与文件内容不同时才替换文件

我正在寻找一个程序,它接受文件名(例如作为参数),从stdin缓冲区读取,并将其与指定文件的内容进行比较。

如果内容不同,程序(理想情况下以原子方式)将使用输入缓冲区的内容覆盖文件。

否则,它会使文件保持不变 - 不会发生写入,不会更改上次修改的时间戳,并且不会生成临时文件。

用法示例:echo "test" | myprogram myfile.txt

该程序是否作为通用 Unix 命令行工具存在?有没有一些好的方法可以在 shell 中简洁地实现此目的,而无需临时文件? (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

相关内容