リストファイルを操作するロジックは変更されていません。 スクリプトパラメータのみが変更されています。これは、拡張子のないアーカイブの名前です。スクリプトは
.tar.gz
を追加し
.tar.gz
。
新規:
- アーカイブの作成は、外部アーカイバーからスクリプトに移動しました。 tar.gzアーカイブが作成されます。
- すべてのパスがシステムに依存するようになりました。 スクリプトはLinuxでも動作するはずです
快適な新しいものに加えて、不快なマイナスが現れました-スクリプトは多くの記憶を食べ始めました。
tarfileモジュールを使用して圧縮アーカイブを作成することはできませんでした。 アーカイブは作成および圧縮されますが、何らかの理由でアーカイブ内でパスが移動します。
つまり アーカイブ
d:\dropbox\my dropbox\backup\backup.tar.gz
を作成する必要があります。 ただし、このgzアーカイブを開くと、tarアーカイブは
dropbox\my dropbox\backup\backup.tar
パスに沿って深くなります。 つまり データへのフルパスは次のとおりです
d:\dropbox\my dropbox\backup\backup.tar.gz\dropbox\my dropbox\backup\backup.tar\...
原則として、あなたはそれで生きることができますが、butい...
したがって、私は別の方法で行いました-最初にすべてのファイルで圧縮せずにtarアーカイブが作成され、次に圧縮されます。 ここで、アーカイブを圧縮する機能のこの場所では、アーカイブ、つまりアーカイブ全体が転送されます。 数百MBのファイル全体がメモリに吸い込まれます。
私たちはまだこの方向を掘り下げて、より良い解決策を見つけるべきです...
Copy Source | Copy HTML
- インポートシステム
- 輸入 OS
- import os .path
- インポート tarfile
- 輸入時間
- gzipをインポートする
- __name__ == "__main__"の場合 :
- if ( len ( sys .argv)< 2 ):
- print ( "使用法:backup.py <出力アーカイブファイル名>" )
- print ( "例:\" backup.py d:\\ dropbox \\ my dropbox \\ backup \ "" )
- 終了( 1 )
- RootFoldersFile = "tobackup.lst"
- IgnoreFoldersFile = "ignore.lst"
- ExtraFile = "extra.lst"
- OutputArchive = sys .argv [ 1 ]
- OutputArchiveTar = OutputArchive + ".tar"
- OutputArchiveTarGz = OutputArchive + ".tar.gz"
- #必須ファイルはRootFoldersFileのみです。存在することを確認してください
- if ( os .path.isfile(RootFoldersFile)ではない ):
- 印刷 ( 「%sは存在しません」 %RootFoldersFile)
- 終了( 1 )
- #ファイルからルートフォルダーを読み取る
- rootFolders = [i で 開いている i.strip()(RootFoldersFile、 "r" ).readlines()]
- #無視する必要があるフォルダーのリストを読み取ります(指定されている場合)
- ignoreList = []
- if ( os .path.isfile(IgnoreFoldersFile)):
- ignoreList = [i.strip()。lower() in open (IgnoreFoldersFile、 "r" ).readlines()]
- #古いアーカイブが存在する場合は削除する
- if ( os .path.isfile(OutputArchiveTar)):
- os .unlink(OutputArchiveTar)
- if ( os .path.isfile(OutputArchiveTarGz)):
- os .unlink(OutputArchiveTarGz)
- filesCount = 0
- #書き込み用に出力アーカイブを開きます(後でgzipします)
- 試してください :
- tar = tarfile 。 open (OutputArchiveTar、 "w" )
- IOError をエラーとして 除く :
- 印刷 (エラー)
- 終了( 1 )
- lastTime = time 。 時間 ()
- rootFoldersのrootFolderの場合:
- ルート、ディレクトリ、 os .walk(rootFolder)のファイル:
- ファイル内のファイルの場合:
- tar.add( os .path.join(ルート、ファイル))
- filesCount + = 1
- #処理されたファイルの数を毎秒表示
- if (time。time()-lastTime> = 1 ):
- print ( "%d files ..." %(filesCount))
- lastTime = time 。 時間 ()
- #無視されたフォルダーをスキップ
- dirのdirの場合:
- if ( dir .lower()のignoreList または ( os .path.join(root、dir).lower()のignoreList)):
- dirs.remove(dir)
- #余分なファイルリストからいくつかのファイルを追加
- if ( os .path.isfile(ExtraFile)):
- [i.strip() for i for open (ExtraFile、 "r" ).readlines()]のファイル:
- tar.add(ファイル)
- tar.close()
- 印刷 ( "圧縮しています..." )
- #Gzip出力アーカイブ
- 試してください :
- gz = gzip open (OutputArchiveTarGz、 "wb" )
- IOError をエラーとして 除く :
- 印刷 (エラー)
- 終了( 1 )
- gz.write( open (OutputArchiveTar、 "rb" ).read())
- gz.close()
- os .unlink(OutputArchiveTar)
- print ( 「出力:%s、%dファイル(s)、%dバイト」 %(OutputArchiveTarGz、filesCount、 os .path.getsize(OutputArchiveTarGz)))
- 印刷 ( "完了" )