用bash shell写了一个脚本,可以实现在linux服务器来备份远程mysqlserver。但是由于mysqlserver数量多,库大,导致备份时间特别长。所以问一下用python能不能呢个高效的实现这个需求。我的脚本如下:
#!/bin/bashmysqldump=`which mysqldump`for i in `cat host.list`doip=$(echo "$i"|cut -f1 -d":")
uname=$(echo "$i"|cut -f2 -d":")
passwd=$(echo "$i"|cut -f3 -d":")
port=$(echo "$i"|cut -f4 -d":")
server=$(echo "$i"|cut -f5 -d":")$mysqldump -h$ip -u$uname -p$passwd -P$port DBname | /bin/gzip >"$server-DBname-`date +%F\-%T`.sql.gz"done
在实现iOS项目的自动打包工程中,我们需要配置好工程的证书文件信息,为了能够自动的根据bundle id来设置不同的profile文件,我们可以通过脚本文件来修改工程的projext.pbxproj文件帮助我们进行自动设置。
1. Project.pbxproj
Xcode项目中的xxx.xcodeproj其实是一个文件夹,右键单击xxx.xcodeproj,显示包内容:
Project.pbxproj的解析
关于这个配置文件的结构,请参考 project.pbxproj,最熟悉的”陌生人 (http://www.olinone.com/?p=215),解析该文件可以使用现有的解析工具mod-pbxproj,该工具是一个python的脚本。其github地址为: https://github.com/kronenthaler/mod-pbxproj 。
为了修改不同taget的profile,我们需要知道这些配置在文件中的具体位置,不难发现:
我们的目标是为不同的bundle id设置不同的profile,所以只需要找到不同target的XCBuildConfiguration,修改其中PROVISIONING_PROFILE的值即可。通过分析project.pbxproj文件结构,你会发现其找到这些target的buildSettings的路径如下:
rootObject=>PBXNativeTarget=>XCConfigurationList=>XCBuildConfiguration。
XCBuildConfiguration会有Debug和Release两个版本,这里我们以修改Release版本的为例进行说明。
2. Python脚本修改profile
需要在工程目录下配置如下脚本文件,通过从json文件中读取配置信息,然后根据不同的bundle id来设置不同的profile文件和其他字段信息。其中xcode_configurator_profile.py为修改profile的脚本文件,profile.json为配置的证书信息。demo如下图所示:
首先在profile.json文件中配置好bundle id和对应的profile文件,如下如所示:
然后在工程目录下执行xcode_configurator_profile.py:
检查profile修改结果:
如果设置了以后有任何问题, 你可以在对应的xxx.xcodeproject下找到对应的备份。
#!/usr/bin/python#-*-coding:utf-8-*-
#Filename: auto_bak.py
#Author: zz
import os
import sys
def get_dir(path):
print path, '\n'
return os.listdir(path)
def bak_file(path,path_bak):
list = os.listdir(path)
for l in list:
file_path = os.path.join(path, l)
file_path_bak = os.path.join(path_bak, l)
print file_path
#如果文件路径为目录
if os.path.isdir(file_path):
#如果在备份目录中文件夹不存在则创建
if not os.path.isdir(file_path_bak):
create_com = '''mkdir -p '%s' ''' \
% (file_path_bak)
if os.system(create_com) == 0:
print create_com
else:
print 'create folder failure!'
os._exit(0)
bak_file(file_path, file_path_bak)
else:
#如果文件已经存在,则比较文件修改时间
if os.path.isfile(file_path_bak):
stat_bak= os.stat(file_path_bak)
stat_source = os.stat(file_path)
#判断文件修改时间
if stat_source.st_mtime <= stat_bak.st_mtime:
continue
cp_com = '''cp '%s' '%s' ''' \
% (file_path, file_path_bak)
if os.system(cp_com) == 0:
print cp_com
else:
print 'create folder failure!'
os._exit(0)
#要备份的文件目录
path = '/home/zyf/appspot/auto_bak/a'
#备份文件目录
path_bak = '/home/zyf/appspot/auto_bak/bak'
#开始备份
bak_file(path, path_bak)