有没有人知道(通过bash)将文件的“版本控制”副本设置到另一个文件的方法?例如:我正在将文件复制到file.bak中。如果file.bak存在,我目前正在覆盖。我想要做的是设置它以便创建多个文件:file,file.bak,file.bak.1,file.bak.2等...
现在,我正在使用:
cp -rf file file.bak
这会覆盖文件(如预期的那样)
答案 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目录清洁,请阅读rcs
,ci
,co
,rlog
,{{1的手册页也许rcsdiff
,你很高兴。您可以更好地控制差异和历史记录,评论的机会,没有像SVN或Git这样的大型VCS的存储库开销。多年来我一直在各种服务器上使用它,因为RCS仍然内置在FreeBSD的基本系统中。 :)