如何在不使用python调用shell的情况下,就是不使用subprocess,os.system等调用tar命令情况下,使用python标准库的tarfile实现tar中--exclude
的效果,例如:
tar -cvpzf /media/sda7/backup.tgz --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys --exclude=/media /
这里对目录/
下的/proc
,/lost+found
,/mnt
,/sys
及/media
目录进行过滤,并其结果打包在/media/sda7/backup.tgz
文件中。
下面的解决方案是可以的,但是对于/home/sky目录下的文件打包就不可以了:
#!/usr/bin/env python
import tarfile
exclude_names = ['build']
def filter_func(tarinfo):
if tarinfo.name not in exclude_names and tarinfo.isdir():
return None
else:
return tarinfo
t = tarfile.open("backup.tgz", "w:gz")
t.add("/home/sky", filter=filter_func)
比如我在sky目录下有1个build目录,只对其进行打包的话,结果如下:
sky@debian:~$ tar -tvf backup.tgz
可以发现目录下完全没有文件。
利用filter参数设定filter函数,filter函数接收TarInfo对象,在filter函数内判断tarinfo对象的类型和名字,如果不符合要求就不返回传入的对象。