python - 如何使用tarfile实现目录过滤的打包文件
黄舟
黄舟 2017-04-18 09:19:38
0
2
503

如何在不使用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 

可以发现目录下完全没有文件。

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(2)
大家讲道理

TarFile.add(name, arcname=None, recursive=True, except=None, *, filter=None)
將檔案名稱加入檔案。 name 可以是任何類型的檔案(目錄、fifo、符號連結等)。如果給定,arcname 指定存檔中檔案的替代名稱。預設情況下,目錄是遞歸添加的。將 recursive 設為 False 可以避免這種情況。如果給了排除,它必須是一個接受一個檔案名稱參數並傳回一個布林值的函數。根據此值,相應的檔案將被排除 (True) 或新增 (False)。 如果指定了過濾器,它必須是關鍵字參數。它應該是一個接受 TarInfo 物件參數並傳回更改後的 TarInfo 物件的函數。如果它傳回 None,則 TarInfo 物件將從檔案中排除。請參閱範例以了解範例。

利用filter參數設定filter函數,filter函數接收TarInfo對象,在filter函數內判斷tarinfo對象的型別與名稱,若不符合要求則不傳回指定的對象。

雷雷
左手右手慢动作

Python tarfile and excludes
參考一下。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!