データがある場合にのみファイルを上書きする

データがある場合にのみファイルを上書きする

コマンド出力でファイルを上書きしようとしていますが、出力が出る前は上書きされません。つまり、私は普通

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

関連情報