データの場合のみファイルを上書き


8

コマンド出力でファイルを上書きしようとしていますが、出力がある場合のみです。つまり、私はたいてい

mycommand > myfile

しかし、これがmyfile空のデータで上書きされる場合は、古いバージョンのを保持したいと思いmyfileます。私は何かをifne使うことが可能であるべきだと思いました、ラ

mycommand | ifne (cat > myfile) 

しかし、それはうまくいきません...

間接的なアプローチ

mycommand | tee mytempfile | ifne mv mytempfile myfile

動作しますが、その一時ファイルの使用は不適切だと考えています。

Q:最初のアイデアが機能しないのはなぜですか?仕事にできますか?または、私の元の問題に対して別の素晴らしい、おそらく完全に異なる解決策がありますか?


5
「別のファイルにリダイレクトし、そのファイルのサイズをチェックし、場合によっては名前を変更する」ことは、私にはかなり簡単に思えます。一時ファイルを使用しないのはなぜですか?
ジェフシャラー

回答:


18

最初のアプローチは機能します。コマンドを与えるだけです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

8

歩行者ソリューション:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.