search
LoginSignup
0

More than 1 year has passed since last update.

posted at

特定のディレクトリ内のファイルを一括でアーカイブ化するスクリプト

はじめに

前回更新からだいぶ間が空きました。
子供が増えて我が家のHDDが子供の写真・動画でパンク寸前になったため、ZIPで固めてバックアップを取ることにしました。そのときに作ったスクリプトです。

環境

・Mac OS Mojave
・python3

引用

退屈なことはPythonにやらせよう

本スクリプトは上記書籍で紹介されていたものをベースに作成しています。
私はこの本でpythonの奥深さを知りました。
pythonを使って日々の作業を自動化したい!python覚えたいけど何かモチベーションになるものが欲しい!という方はぜひ手にとって見てください。

ソースコード

メイン処理(アーカイブ化)は上記書籍で紹介されているものと同等のものを使用しています。
Oreilly JapanのGitHubにサンプルコードが公開されているため、コードだけみたい方はそちらを参照してみてください。

私は、ビデオカメラで記録したMP4ファイルをZIPでアーカイブし、それを外付けHDDにバックアップとして保存する作業をよくやるのですが、容量が大きいと一個一個手作業でやると時間がかかるので、下記のようにコマンドライン引数にして一括処理できるようにしています。

python3 backupToZip.py [ビデオカメラのUSB接続先PATH] [外付けHDD(バックアップ先)のPATH]
backupToZip.py
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ファイルをアーカイブ対象外としたときの例)

backupToZip_revised_39step-42step.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ファイルの格納先です。

スクリーンショット 2020-05-05 23.33.05.png

これに対し、下記コマンドを実行します。

python3 backupToZip.py /TARGET /ZIP

実行すると下記の通り、ZIPディレクトリの中にアーカイブ化されたファイルが格納されました。

スクリーンショット 2020-05-05 23.41.42.png
スクリーンショット 2020-05-05 23.42.25.png

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0