데이터가 있는 경우에만 파일 덮어쓰기

데이터가 있는 경우에만 파일 덮어쓰기

명령 출력으로 파일을 덮어쓰려고 하는데 출력이 나오기 전에는 덮어쓰지 않습니다. 즉, 나는 보통

mycommand > myfile

하지만 빈 데이터로 덮어쓰게 된다면 myfile이전 버전을 유지하고 싶은데 , myfile뭔가를 사용하면 ifne가능할 것 같아요.

mycommand | ifne (cat > myfile) 

그러나 이것은 작동하지 않습니다 ...

간접적인 방법

mycommand | tee mytempfile | ifne mv mytempfile myfile

작동하지만 임시 파일을 사용하는 것은 우아하지 않다고 생각합니다.

묻다:첫 번째 아이디어가 왜 효과가 없었나요? 작동하도록 만들 수 있습니까? 아니면 내 원래 문제에 대한 또 다른 좋은 해결책이 있습니까?

답변1

첫 번째 방법이 작동하면 다음 명령을 실행하면 됩니다 ifne(참고 자료 참조 man ifne).

NAME
       ifne - Run command if the standard input is not empty

SYNOPSIS
       ifne [-n] command

DESCRIPTION
       ifne  runs  the  following command if and only if the standard input is
       not empty.

그래서 실행 명령을 주어야 합니다. 거의 다 왔고 tee일할 준비가 되었습니다.

command | ifne tee myfile > /dev/null

명령으로 생성되는 데이터가 많지 않고 데이터가 변수에 들어갈 만큼 작은 경우 다음을 수행할 수도 있습니다.

var=$(mycommand)
[[ -n $var ]] && printf '%s\n' "$var" > myfile

답변2

보행자 솔루션:

tmpfile=$(mktemp)

mycommand >"$tmpfile"
if [ -s "$tmpfile" ]; then
    cat "$tmpfile" >myfile
fi

rm -f "$tmpfile"

즉, 출력을 임시 파일에 저장한 다음 비어 있는지 테스트합니다. 비어 있지 않으면 해당 내용을 파일에 복사합니다. 마지막으로 임시 파일을 삭제하세요.

cat "$tmpfile" >myfile대신 cp "$tmpfile" myfile(또는 )을 사용하여 mv을 사용하는 것과 동일한 효과를 얻었습니다 mycommand >myfile. 이는 기존 파일을 자르고 소유권과 권한을 보존하는 것입니다.

$TMPDIR(에 의해 ) 메모리 마운트 파일 시스템에 있는 경우 mktemp가능한 경우를 제외하고는 디스크에 기록되지 않습니다 myfile. 그것은 또한 사용되는 것보다 휴대성이 더 좋습니다 ifne.

관련 정보