気付くとデスクトップやドキュメントに要らないファイルがたくさんあるという方も多いのではないだろうか。今回は、Pythonでデスクトップとドキュメントのフォルダを自動バックアップするプログラム作ってみよう。バックアップしておけば安心してPC内の大掃除ができる。
捨てられない人でもPCなら大丈夫
「部屋の乱れは心の乱れ」と言われても、なかなか掃除する気にならないという人も多いだろう。掃除が苦手な人のPCはやはりファイルも乱雑になっている印象がある。しかし、パソコンの中であれば、ルールさえしっかり決めてしまえば、スッキリと整理ができる。
そもそも、掃除が苦手で部屋が汚い人の多くが抱える問題が「捨てられないこと」だ。物に溢れているなら、いかに上手に収納しようが乱雑な印象が残ってしまう。この点、PC内のデジタルデータは完全な複製が可能なので、バックアップさえとってしまえば、あまり使わないファイルは心置きなくPCから捨てることができる。
今回は、ファイル整理の前段階として、Pythonを使ってパソコンのデスクトップとドキュメントを自動バックアップする方法を紹介しよう。
最初にバックアップ戦略を決めよう
筆者が実践しているバックアップの手法だが、大容量ストレージにバックアップする日のフォルダ(例えば「2022-12-19」とか「2023-01-12」)を作成し、その配下にデスクトップとドキュメントを丸ごとコピーするという簡単なものだ。
と言うのも、必要なファイルと不要なファイルを選別してバックアップするのは時間がかかる。バックアップのたびに選別が必要だと、面倒でバックアップの頻度が落ちてしまうだろう。そのため、上記のように一度決めたルールに従って、何も考えずにバックアップするのが良いだろう。これを定期的に行う。
なお、最近では、HDD/SSDも大容量化していることに加えて、クラウドストレージにファイルをバックアップすることも容易だ。そのため、ファイルが重複するとしても、コストをそれほどかけずにデータの丸ごとバックアップが可能だ。
もちろん、専用のバックアップツールを導入することで、重複ファイルを作ることなく任意の状態に戻すこともできるが、大切なファイルを何重にもバックアップしているのだと思えば悪くない。また、大容量ストレージの価格は年々下がっているので、今ではそれほど気にすることはないだろう。
Pythonで自動バックアップツールを作ろう
そして、どうせなら、バックアップを実行するPythonスクリプトを作っておいて、定期的に実行するようにすると良いだろう。指定したフォルダに年月日のフォルダを作成し、デスクトップとドキュメントにある全ファイルをコピーするプログラムは次のようになる。
import os, shutil
from pathlib import Path
from datetime import datetime
# バックアップ先のフォルダを指定(書き換えが必要) --- (*1)
backup_root_dir = Path(r'D:\\') # WindowsでDドライブにバックアップ
# backup_root_dir = Path(r'/Volumes/Extreme SSD/') # macOSで外付けSSDに
# 年月日のフォルダを作る --- (*2)
ymd = datetime.now().strftime('%Y-%m-%d')
backup_dir = backup_root_dir.joinpath(ymd)
backup_dir.mkdir(parents=True, exist_ok=True)
print('[Backup]', backup_dir)
# バックアップを実行する関数 --- (*3)
def my_backup(name, src, des):
src = Path(src).absolute()
des = Path(des).absolute()
print(f'[{name}] {src}')
copy_ex(src, des, 0)
# 再帰的にファイルをコピー --- (*4)
def copy_ex(src, des, level):
try:
if src.is_file():
shutil.copy2(src, des)
# print('-', src)
return
des.mkdir(exist_ok=True)
for f in src.iterdir():
copy_ex(f, des.joinpath(f.name), level+1)
except:
print('[ERROR]', src)
# デスクトップのコピー --- (*5)
desktop_dir = os.path.expanduser('~/Desktop')
my_backup('Desktop', desktop_dir, backup_dir.joinpath('Desktop'))
# ドキュメントをコピー --- (*6)
doc_dir = os.path.expanduser('~/Documents')
my_backup('Documents', doc_dir, backup_dir.joinpath('Documents'))
print('完了')
プログラムを実行するには、まず、上記のプログラムを「backup.py」という名前で保存しよう。そして、上記プログラムの(*1)にバックアップ先のパスを指定する。
続いて、Pythonに付属のIDLEから上記ファイルを選んで実行するか、あるいは、ターミナル(WindowsのPowerShellやmacOSのターミナル.app)を起動して、以下のコマンドを実行しよう。
# --- Windowsの場合 ---
python backup.py
# --- macOSの場合 ---
python3 backup.py
【注意】Windowsで実行する場合、ドキュメント以下に隠しフォルダ「My Pictures」「My Music」「My Videos」がありコピーできないというエラーがでる。このフォルダはショートカットであり、Pythonで正しく処理できないので無視しても問題ない。
以下はプログラムを実行したところだ。実行したらバックアップが正しく完了したことを確認しよう。ファイルのパーミッションが問題でコピーに失敗していることもあるので注意しよう。
プログラムを確認してみよう。(*1)には、バックアップ先のフォルダを指定する。(*2)ではバックアップ先に「年-月-日」のフォルダを作る。これが今回のコピー先となる。
そして、(*3)以降ではバックアップを実行する関数を定義した。フォルダを丸ごとコピーするには、shutil.copytree関数があるが、一つでもエラーがあるとその時点でコピーに失敗してしまう。そこで、再帰的にファイルをコピーする関数を作った。実際にファイルをコピーする関数が(*4)だ。
(*5)ではデスクトップのパスを得て、フォルダをコピーする。そして、(*6)ではドキュメントのパスを得てフォルダをコピーする。
なお、os.path.expanduserを使うと、「~」をユーザーのホームディレクトリに置換できる。とは言え、確実に正確なパスが得られる訳ではない。そこで、もしデスクトップやドキュメントのパスを自身で変更している場合には、このパスを変更する必要がある。
バックアップしたら思い切りファイルを削除しよう
なお、上記のようなプログラムを使って、データを自動でバックアップしたら、要らないファイルやフォルダをどんどんゴミ箱に捨てていこう。ファイルがバックアップされているので、それほどファイルが必要かどうかで悩む必要はない。最近使ったかどうかを確認して、使っていなければ気軽に削除しよう。後になって必要になったらバックアップを探せば良いのだ。
ところで、バックアップ戦略で紹介した画面では、月1回のバックアップしか存在していないのでそれで大丈夫かと思う人もいるだろうか。
筆者は日々の執筆やプログラミングの仕事ではGitなどのバージョン管理ツールを利用している。そのおかげで、デスクトップやドキュメント(書類)フォルダを丸ごとバックアップするのは月に1度で十分だ。
しかし、Pythonで自動化した場合、仕事に応じて毎日バックアップするなど頻度を調整すると良いだろう。毎日バックアップする場合だと、さすがにストレージ容量が心配になるので、3ヶ月たったら、古いバックアップを間引くなどルールを決めると良いだろう。
まとめ
Pythonを利用すると日々の作業を自動化できる。データのバックアップは業務により、より詳細にコピー方法をカスタマイズしたい場面も多いことだろう。Pythonを使えば、いくらでも細かくコピー方法を指定できる。この機会にPCのバックアップ戦略を見直してみよう。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。