2

我想知道如何在不覆盖旧文件的情况下复制文件,我没有可用的 -n 开关。

据我所知, cp -u 和 rsync 都会覆盖旧文件,我不希望这种行为,我想始终保留旧文件。

谢谢

4

3 回答 3

3

您可以使用 " --interactive" 选项(出现在我cp的 from 中GNU coreutils 6.12)在覆盖之前提示您并用默认值填充它:

echo 'n' | cp --interactive ~/somefile.txt ~/somefile_already_exists.txt
于 2013-07-12T16:35:58.917 回答
1

将文件复制到同一目录中新创建的临时文件中(参见mktemptempfile在 Linux 下)。然后使用ln尝试为副本指定您想要的名称。ln如果名称存在,将失败;您可以尝试使用不同的名称,或者只是发出错误消息,或者其他什么。最后,删除临时名称。

于 2013-07-12T17:01:50.523 回答
-3

这是一种非交互式方法。它检查文件是否存在(在初始附加随机数之后)。如果是,那么它会寻找另一个随机数。这可以通过不同的方式进行修改。可以添加参数,等等。

   copyfile() {
      n=$RANDOM
      while [ -f $1__$n ]      
       do
       n=$RANDOM
       done
       cp $1 $1__$n
    }

用法:

copyfile file_to_copy

您的文件将被命名为:

原始文件.txt_20625

附加的数字很可能防止任何覆盖的机会。如果这还不够,那么可以在文件末尾添加任何他们想要的东西,比如时间戳。如果您在这些措施之后仍然担心覆盖,那么您可能应该定期备份您的文件。

于 2013-07-12T16:36:53.003 回答