需求:为所有的重要的文件创建相应的备份。
首先是问题解析:
1.找到那些文件是我们需要备份的
2.备份的文件要保存到哪里
3.怎么存储备份
问题的解决方案:
1.需要备份的文件和目录由一个列表指定
2.将备份保存到指定的备份文件夹中
3.将文件备份成一个zip文件。
4.zip的存档名称是当前的时间和日期
之后进行编码:
#!/usr/bin/env python # coding=utf-8 # filename : backup_ver1.py import os import time # set the file you need backup source=‘/home/grace/python/‘ # set the dir you store the backup file target_dir=‘/home/grace/test/‘ # backup filename target=target_dir + time.strftime(‘%Y%m%d%H%M%S‘)+‘.zip‘ # set zip command zip_command="zip -qr ‘%s‘ %s" %(target,‘‘.join(source)) #Run the zip_command if os.system(zip_command)==0: print ‘Successful backup to‘,target else: print ‘Backup Failed!‘
这里由几点需要解释:
1.zip命令的使用
linux zip命令的基本用法是:zip [参数] [打包后的文件名] [打包的目录路径]
linux zip命令参数列表:
-a 将文件转成ASCII模式-F 尝试修复损坏的压缩文件-h 显示帮助界面-m 将文件压缩之后,删除源文件
-n 特定字符串 不压缩具有特定字尾字符串的文件-o 将压缩文件内的所有文件的最新变动时间设为压缩时候的时间-q 安静模式,在压缩的时候不显示指令的执行过程-r 将指定的目录下的所有子目录以及文件一起处理-S 包含系统文件和隐含文件(S是大写)-t 日期 把压缩文件的最后修改日期设为指定的日期,日期格式为mmddyyyy
举例:
将/home/Blinux/html/ 这个目录下所有文件和文件夹打包为当前目录下的html.zip
zip –q –r html.zip /home/Blinux/html
上面的命令操作是将绝对地址的文件及文件夹进行压缩.以下给出压缩相对路径目录
比如目前在Bliux这个目录下,执行以下操作可以达到以上同样的效果.
zip –q –r html.zip html
比如现在我的html目录下,我操作的zip压缩命令是
zip –q –r html.zip *
以上是在安静模式下进行的,而且包含系统文件和隐含文件
linux unzip 命令详解
功能说明:解压缩zip文件
语 法:unzip [-cflptuvz][-agCjLMnoqsVX][-P <密码>][.zip文件][文件][-d <目录>][-x <文件>] 或 unzip [-Z]
补充说明:unzip为.zip压缩文件的解压缩程序。
参 数:
-c 将解压缩的结果显示到屏幕上,并对字符做适当的转换。
-f 更新现有的文件。
-l 显示压缩文件内所包含的文件。
-p 与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换。
-t 检查压缩文件是否正确。
-u 与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中。
-v 执行是时显示详细的信息。
-z 仅显示压缩文件的备注文字。
-a 对文本文件进行必要的字符转换。
-b 不要对文本文件进行字符转换。
-C 压缩文件中的文件名称区分大小写。
-j 不处理压缩文件中原有的目录路径。
-L 将压缩文件中的全部文件名改为小写。
-M 将输出结果送到more程序处理。
-n 解压缩时不要覆盖原有的文件。
-o 不必先询问用户,unzip执行后覆盖原有文件。
-P<密码> 使用zip的密码选项。
-q 执行时不显示任何信息。
-s 将文件名中的空白字符转换为底线字符。
-V 保留VMS的文件版本信息。
-X 解压缩时同时回存文件原来的UID/GID。
[.zip文件] 指定.zip压缩文件。
[文件] 指定要处理.zip压缩文件中的哪些文件。
-d<目录> 指定文件解压缩后所要存储的目录。
-x<文件> 指定不要处理.zip压缩文件中的哪些文件。
-Z unzip -Z等于执行zipinfo指令
范例:
zip命令可以用来将文件压缩成为常用的zip格式。unzip命令则用来解压缩zip文件。
1. 我想把一个文件abc.txt和一个目录dir1压缩成为yasuo.zip:
# zip -r yasuo.zip abc.txt dir1
2.我下载了一个yasuo.zip文件,想解压缩:
# unzip yasuo.zip
3.我当前目录下有abc1.zip,abc2.zip和abc3.zip,我想一起解压缩它们:
# unzip abc\?.zip
注释:?表示一个字符,如果用*表示任意多个字符。
4.我有一个很大的压缩文件large.zip,我不想解压缩,只想看看它里面有什么:
# unzip -v large.zip
5.我下载了一个压缩文件large.zip,想验证一下这个压缩文件是否下载完全了
# unzip -t large.zip
6.我用-v选项发现music.zip压缩文件里面有很多目录和子目录,并且子目录中其实都是歌曲mp3文件,我想把这些文件都下载到第一级目录,而不是一层一层建目录:
# unzip -j music.zip
********************************************************************
之后在回到我们的程序当中
我们使用了os和time模块,所以我们输入它们。如果你由多个目录中的文件需要备份,那么你可以选择source的这里采用列表
来指定你所需要备份的文件和目录。目标目录我们使用target_dir来指定。zip归档的名称是目前的日期和时间,我们使用time.strftime()
函数获得。其中还包括了zip的扩展名。
我们可以把上述的程序做一些改进,使用当前的日期命名文件夹,之后使用时间来作为文件名
#!/usr/bin/env python # coding=utf-8 #filename : backup_ver2.py # author : chicho # date : 2014-03-22 import os import time #the file dir you need backup source = ‘/home/grace/python/‘ #the dir you store the target target_dir = ‘/home/grace/test‘ #create a directory to save you backup file today = target_dir +os.sep+ time.strftime(‘%Y%m%d‘) now = time.strftime(‘%H%M%S‘) if not os.path.exists(today): os.mkdir(today) print ‘Successful created directory‘,today target = today + os.sep + now + ‘.zip‘ zip_command="zip -qr ‘%s‘ %s" %(target,‘‘.join(source)) #Run the backup_ver2.py if os.system(zip_command)==0: print ‘Sucessful backup to‘,target else: print ‘Backup Failed!‘
但是这个时候文件还是可以改进的,比如说如果我们的文件就是一个时间,那么我们不知道我们备份的文件是什么,按照文件的名字来备份的话
这样相对来说是比较清楚的。这样,要是程序和用户有一些交互的话那样就更好了。
#!/usr/bin/env python # coding=utf-8 # filename : backup_ver3.py import os import time source=‘/home/grace/python/‘ target_dir=‘/home/grace/test/‘ today=target_dir+time.strftime(‘%Y%m%d‘) now = time.strftime("%H%M") comment=raw_input(‘Enter comment->‘) if(comment==0): target=today+os.sep+now+‘.zip‘ else: target = today + os.sep+now +‘_‘+ comment.replace(‘ ‘,‘_‘)+‘.zip‘ if not os.path.exists(today): os.mkdir(today) print ‘Sucessfully create directory‘,today zip_command="zip -qr ‘%s‘ %s" %(target,‘‘.join(source)) if os.system(zip_command)==0: print ‘Sucessfully backup to‘,target else: print ‘Backup Failed!‘
之后便可以看见运行的结果。