用python编写脚本实现备份文件

需求:为所有的重要的文件创建相应的备份。


首先是问题解析:

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 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!'



之后便可以看见运行的结果。





你可能感兴趣的:(压缩,python,备份)