Centos将文件复制到另一个文件中,如果存在,则创建一个版本

时间:2014-09-23 20:47:25

标签: linux bash

有没有人知道(通过bash)将文件的“版本控制”副本设置到另一个文件的方法?例如:我正在将文件复制到file.bak中。如果file.bak存在,我目前正在覆盖。我想要做的是设置它以便创建多个文件:file,file.bak,file.bak.1,file.bak.2等...

现在,我正在使用:

cp -rf file file.bak

这会覆盖文件(如预期的那样)

3 个答案:

答案 0 :(得分:2)

或:

cp --backup=t file1 file2

重复几次以查看结果......

请参阅https://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html

答案 1 :(得分:1)

只需使用测试

[ -e file.bak ] && cp -r file file.bak.$(date +%s) || cp -r file file.bak

如果file.bak

形式中已存在file.bak.1411505497,则会创建一个唯一备份

答案 2 :(得分:1)

有许多方法可以为这只猫提供皮肤。

由于您使用的是Linux,因此您可能已经获得了GNU mv命令,该命令可能包含--backup选项。你可以将它包装在shell函数中:

bkp() {

  file="$1"

  if [ -f "$file" ]; then
    /bin/mv -v --backup=numbered "$(mktemp ${file}XXX)" "$file"
    #/bin/rm "$file"
  fi

}

例如,您可以将其放在.bashrc中。然后你可以按如下方式使用它:

# bkp foo

这会将foo复制到编号的备份文件。如果这是您正在轮换的日志文件,则可以取消注释rm

另一种选择,对于不使用GNU工具(即FreeBSD,OSX)的操作系统来说更容易移植,可能就像这种快速而肮脏的解决方案可能有效:

bkp() {

  file="$1"

  if [ -f "$file" ]; then

    # increment existing files up to 10
    for n in {9..1}; do
      if [ -f $file.$n ]; then
        # remove -v if you want less noise.
        mv -v "${file}.$n" "${file}.$[n+1]"
      fi
    done

    # move the original to first backup position
    mv "$file" "$file.1"

  else

    echo "Not found: $file" >&2

  fi
}

它的缺点在于,如果缺少一些数字,它不会压缩你的文件列表(并会抛出错误),但如果它很重要,你可以添加这些东西。您可以使用相同的方式,如果您需要保留原始文件,请将最终mv更改为cp

最后一个选项我也会在评论中提及。既然你说你正在使用这个解决方案备份“系统文件”(我认为你的意思是/ etc /中的东西),你应该考虑使用实际的版本控制系统来控制这些文件的版本。

存在许多选项,但我建议RCS的简单性和低开销。只需安装软件包mkdir /etc/RCS以保持/ etc目录清洁,请阅读rcscicorlog,{{1的手册页也许rcsdiff,你很高兴。您可以更好地控制差异和历史记录,评论的机会,没有像SVN或Git这样的大型VCS的存储库开销。多年来我一直在各种服务器上使用它,因为RCS仍然内置在FreeBSD的基本系统中。 :)