仅当数据存在时才覆盖文件

仅当数据存在时才覆盖文件

我试图用命令输出覆盖文件,但前提是有任何输出。也就是说,我通常想要

mycommand > myfile

但如果这会myfile被空数据覆盖,我希望保留旧版本的myfile.我认为使用一些东西ifne应该是可能的,la

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

相关内容