我运行svn status得到了修改过的文件:
svn status
? .settings
? .buildpath
? .directory
A A.php
M B.php
D html/C.html
M html/D.fr
M api/E.api
M F.php
..
我想保留所有这些文件
zcvf MY.tar.gz all files that svn stat display
(不包括?只是M,A,D)
我的想法是创建python脚本可以运行shell,因为现在要做到这一点我只是逐个复制文件名。
zcvf MY.tar.gz all the files that we run svn stat
任何人都可以指导如何做这个或一些相关的教程?但如果你认为difficult than copy && paste
我会忽略我的尝试吗?
感谢
答案 0 :(得分:2)
如果您可以在shell中的单行代码中执行此操作,我不明白为什么要使用python。
svn status | grep "^[AMD]" | sed 's/^.\{8\}//' | xargs zcvf My.tar.gz
我使用grep
仅选择已修改的行,如果您希望所有svn状态列表(也包括已添加/删除的文件)的文件都可以将该部分保留。我在这里使用sed
来删除每行的第一部分,我确信有一种更简单的方法可以做到这一点,但我现在想不到。
答案 1 :(得分:0)
答案 2 :(得分:0)
subprocess
是Pythonic的方式,但使用一个小的bash单行可能是一个较短的想法。
svn status | egrep "^ M" | awk '{s=s $2 " "} END {print "tar cvfz MY.tar "s}'
import subprocess as sp
p=sp.Popen('svn status', shell=True, stdout=sp.PIPE,
stderr=sp.PIPE).communicate()[0]
files=[]
for line in p:
if line.strip().find('M')==0:
files.append(line.split(' ')[1].strip())
files=' '.join(files)
sp.Popen('tar cvfz MY.tar.gz '+files, shell=True).communicate()
答案 3 :(得分:0)
您可以使用check_output()
和check_call()
函数:
#!/usr/bin/env python
from subprocess import check_call, check_output as qx
filenames = [line[8:] # extract filename
for line in qx(['svn', 'status']).splitlines()
if not line.startswith('?')] # exclude files that are not under VC
check_call(['tar', 'cvfz', 'MY.tar.gz'] + filenames)
在Python上< 2.7见check_output()
recipe。