我想知道如何在不覆盖旧文件的情况下复制文件,我没有可用的 -n 开关。
据我所知, cp -u 和 rsync 都会覆盖旧文件,我不希望这种行为,我想始终保留旧文件。
谢谢
您可以使用 " --interactive
" 选项(出现在我cp
的 from 中GNU coreutils 6.12
)在覆盖之前提示您并用默认值填充它:
echo 'n' | cp --interactive ~/somefile.txt ~/somefile_already_exists.txt
将文件复制到同一目录中新创建的临时文件中(参见mktemp
或tempfile
在 Linux 下)。然后使用ln
尝试为副本指定您想要的名称。ln
如果名称存在,将失败;您可以尝试使用不同的名称,或者只是发出错误消息,或者其他什么。最后,删除临时名称。
这是一种非交互式方法。它检查文件是否存在(在初始附加随机数之后)。如果是,那么它会寻找另一个随机数。这可以通过不同的方式进行修改。可以添加参数,等等。
copyfile() {
n=$RANDOM
while [ -f $1__$n ]
do
n=$RANDOM
done
cp $1 $1__$n
}
用法:
copyfile file_to_copy
您的文件将被命名为:
原始文件.txt_20625
附加的数字很可能防止任何覆盖的机会。如果这还不够,那么可以在文件末尾添加任何他们想要的东西,比如时间戳。如果您在这些措施之后仍然担心覆盖,那么您可能应该定期备份您的文件。