有谁知道一种方法(通过bash)设置一个文件的“版本控制”副本到另一个?例如:我正在将文件复制到file.bak中。如果存在file.bak,我现在正在覆盖。我想要做的是设置它,以便它创建多个文件:文件,file.bak,file.bak.1,file.bak.2等...Centos复制文件到另一个文件,如果存在,创建一个版本
现在,我使用:
cp -rf file file.bak
这目前覆盖文件(如预期)
有谁知道一种方法(通过bash)设置一个文件的“版本控制”副本到另一个?例如:我正在将文件复制到file.bak中。如果存在file.bak,我现在正在覆盖。我想要做的是设置它,以便它创建多个文件:文件,file.bak,file.bak.1,file.bak.2等...Centos复制文件到另一个文件,如果存在,创建一个版本
现在,我使用:
cp -rf file file.bak
这目前覆盖文件(如预期)
只需使用一个测试
[ -e file.bak ] && cp -r file file.bak.$(date +%s) || cp -r file file.bak
如果file.bak
形式已经存在,这将创建一个独特的备份file.bak.1411505497
或:
cp --backup=t file1 file2
重复几次看到的结果...
看到https://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html
有很多方法对皮肤这只猫。
由于您使用的是Linux,很可能您已经获得了GNU mv
命令,其中可能包含--backup
选项。你可以把它包装在一个shell函数中:例如,你可以把它放在你的.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目录的清洁,请阅读手册页rcs
,ci
,co
,rlog
, rcsdiff
或许还有rcsintro
,那么您就很好。您可以更好地控制差异和历史,评论的机会,以及SVN或Git等大型VCS存储库的开销。多年来,我一直在各种服务器上使用它,因为RCS仍然内置在FreeBSD的基本系统中。 :)
http://unix.stackexchange.com/questions/16669/copy-files-with-renaming – snies 2014-09-23 20:53:28
你备份了哪些文件?您可能需要考虑使用像'git'这样的源代码控制系统来为您管理版本化的备份。 – chepner 2014-09-23 21:03:19
@chepner我正在备份系统文件 – 2014-09-23 21:04:55