我正在寻找一个程序,它接受文件名(例如作为参数),从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