用Python脚本运行Shell脚本?
我运行了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 所有在svn stat中显示的文件
(不包括状态为?的文件,只包括M、A、D状态的文件)
我的想法是创建一个Python脚本来运行这个命令,因为现在我只能一个一个地复制文件名。
zcvf MY.tar.gz 所有在svn stat中显示的文件
有没有人能指导我怎么做,或者提供一些相关的教程?不过如果你觉得这比复制粘贴要难,我就不想尝试了。
谢谢!
4 个回答
0
subprocess
是在Python中处理子进程的标准方法,但用一行简单的bash命令可能会更简洁。
一行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()
1
2
我不明白为什么你要用Python来做这个,如果你可以在命令行里用一行代码就搞定的话。
svn status | grep "^[AMD]" | sed 's/^.\{8\}//' | xargs zcvf My.tar.gz
我用了grep
来只选择那些被修改过的行,如果你想要svn状态列出的所有文件(包括那些被添加或删除的),你可以不加这一部分。我在这里用了sed
来删除每一行的第一部分,我相信还有更简单的方法,但我现在想不起来了。