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

관련 정보