はじめに
前回更新からだいぶ間が空きました。
子供が増えて我が家のHDDが子供の写真・動画でパンク寸前になったため、ZIPで固めてバックアップを取ることにしました。そのときに作ったスクリプトです。
環境
・Mac OS Mojave
・python3
引用
本スクリプトは上記書籍で紹介されていたものをベースに作成しています。
私はこの本でpythonの奥深さを知りました。
pythonを使って日々の作業を自動化したい!python覚えたいけど何かモチベーションになるものが欲しい!という方はぜひ手にとって見てください。
ソースコード
メイン処理(アーカイブ化)は上記書籍で紹介されているものと同等のものを使用しています。
Oreilly JapanのGitHubにサンプルコードが公開されているため、コードだけみたい方はそちらを参照してみてください。
私は、ビデオカメラで記録したMP4ファイルをZIPでアーカイブし、それを外付けHDDにバックアップとして保存する作業をよくやるのですが、容量が大きいと一個一個手作業でやると時間がかかるので、下記のようにコマンドライン引数にして一括処理できるようにしています。
python3 backupToZip.py [ビデオカメラのUSB接続先PATH] [外付けHDD(バックアップ先)のPATH]
import zipfile, os, shutil
import sys
args = sys.argv
argc = len(args)
# The procedure in the case arguments' length is not enough
if(argc != 3):
print('')
print('backupToZip Usage:')
print('args[1]: Set abusolute path included files and directories you want to back up')
print('args[2]: Set abusolute path you want to put zipfile')
print('')
quit()
def backup_to_zip(folder):
# Back up all directories to Zip file
folder = os.path.abspath(folder) # set absolute path
number = 1
while True:
zip_filename = os.path.basename(folder) + '_' + str(number) + '.zip'
if not os.path.exists(zip_filename):
break
number = number + 1
# Create Zip file
print('Creating {}...'.format(zip_filename))
backup_zip = zipfile.ZipFile(zip_filename, 'w')
# Searching directory tree and compressing file
for foldername, subfolders, filenames in os.walk(folder):
print('Adding files in {}...'.format(foldername))
# Add current directory to Zip file
backup_zip.write(foldername)
# Add all files of current directory to Zip file
for filename in filenames:
new_base = os.path.basename(folder) + '_'
if filename.startswith(new_base) and filename.endswith('.zip'):
continue
backup_zip.write(os.path.join(foldername, filename))
backup_zip.close()
# Set abusolute path you want to put zipfile
shutil.move(zip_filename,args[2])
print('Done. ')
if os.path.exists(args[1]) and os.path.exists(args[2]):
# Set path included files and directories you want to back up
backup_to_zip(args[1])
else:
# If paths including args[1] and args[2] are not exist
# The following message is raised
print('Directory not found. ')
特定の拡張子をバックアップ対象外としたい場合は、endswithメソッドを使って下記の様にすればOKです(下記はpyファイルをアーカイブ対象外としたときの例)
if filename.startswith(new_base) and filename.endswith('.zip'):
continue
if not filename.endswith('.py'):
backup_zip.write(os.path.join(foldername, filename))
実行例
例として、"/TARGET"ディレクトリと"/ZIP"ディレクトリを用意しました。
"/TARGET"ディレクトリ内にあるファイルがアーカイブ化対象のファイル
"/ZIP"ディレクトリがアーカイブ化されたZIPファイルの格納先です。

これに対し、下記コマンドを実行します。
python3 backupToZip.py /TARGET /ZIP
実行すると下記の通り、ZIPディレクトリの中にアーカイブ化されたファイルが格納されました。

