見出し画像

作成日時が「ある時点からある時点まで」のファイルやディレクトリを一括削除

今日は、Udemyの講座で学習した過程で作成したファイルやディレクトリを削除するスクリプトを書いていきます。

やりたいこと

作成日時が「ある時点からある時点まで」のファイルやディレクトリをすべて削除する

まず、手始めに1つのファイルを削除するスクリプトを書いてみました。

import os

os.remove('file2')

次に、ファイルやディレクトリの作成日を取得します。
作成日を取得するには、osモジュールの「os.path.getctime」関数を用います。

得られる結果は、秒単位のデータなので、日付データに変換する必要があります。

変換の方法については、先日のnoteでもご紹介しました。

変換するには、datetimeモジュールの「datetime.fromtimestamp」関数を用います。

最終的に必要なのは日付のみで、時刻データは不要なので、dateに変換します。

以上をまとめると、
①「os.path.getmtime」で更新日の秒データを取得する
②上記①の秒データをdatetime型に変換する
③上記②のdatetime型のデータをdate型に変換する

上記の①で、「os.path.getmtime」を「os.path.getctime」に変更します。

import os
from datetime import datetime, date

t = os.path.getctime('/home/toshiya/file3')
dt = datetime.fromtimestamp(t)
dday = dt.date()

作成日がある時点より後のファイル・ディレクトリの一覧を取得

これまでは、一つのファイルに絞って処理を行ってきました。
次に、ディレクトリ「/home/ユーザー」の中で、作成日がある時点より後のファイル・ディレクトリの一覧を取得します。

ここで、「ある時点」とは、フォルダ「self_taught_programmer」の更新日時を指します。

ファイルとディレクトリの一覧を取得するには、osモジュールの「listdir()」関数を用います。

import os
from datetime import datetime, date

BASETIME = os.path.getmtime('/home/toshiya/self_taught_programmer')
files = os.listdir('/home/toshiya')
for file in files: 
   t = os.path.getctime(file)
   if BASETIME < t:
       print(file)
       print()
 

表示結果は以下のようになります。
先頭が「.」で始まる隠しファイルも幾つか含まれていますね。

画像1

隠しファイルを除外した一覧を取得

隠しファイルは削除対象から除くことにします。
ファイル名を取得するには、「os.path.basename()」を使用します。

import os
from datetime import datetime, date

BASETIME = os.path.getmtime('/home/toshiya/self_taught_programmer')
files = os.listdir('/home/toshiya')
for file in files: 
   t = os.path.getctime(file)
   if BASETIME < t:
       if not os.path.basename(file).startswith('.'):
           print(file)
           print()

うーん。
実行結果を見ると、絶対に削除したくないディレクトリ(「ピクチャ」や「Dropbox」)が一覧に含まれていますね。

そこで、条件を変更します。
作成日時がある時点からある時点までのファイル・ディレクトリの一覧表示を得ることを考えます。

「ある時点から」とは、前述の、ディレクトリ「self_taught_programmer」の更新日時で、変数STARTTIMEに代入します。

また、「ある時点まで」とは、ディレクトリ「Dropbox」の更新日時で、変数ENDTIMEに代入します。

コードは以下のようになります。

import os
from datetime import datetime, date

STARTTIME = os.path.getmtime('/home/toshiya/self_taught_programmer')
ENDTIME = os.path.getmtime('/home/toshiya/Dropbox')
files = os.listdir('/home/toshiya')
for file in files: 
   t = os.path.getctime(file)
   if STARTTIME < t and t < ENDTIME:
       if not os.path.basename(file).startswith('.'):
           print(file)
           print()

表示結果は以下のようになります。

画像2

では、実際に削除していきます。

import os
from datetime import datetime, date
import shutil

STARTTIME = os.path.getmtime('/home/toshiya/self_taught_programmer')
ENDTIME = os.path.getmtime('/home/toshiya/Dropbox')
count = 0
files = os.listdir('/home/toshiya')
for file in files: 
   t = os.path.getctime(file)
   if STARTTIME < t and t < ENDTIME:
       if not os.path.basename(file).startswith('.'):
           if os.path.isfile(file):
               os.remove(file)
           else:
               shutil.rmtree(file)

ファイルとディレクトリを同じ関数で一度に削除することはできないので、if文と「os.path.isfile()」を用いて、指定したパスがファイルかディレクトリを調べています。

空ではないディレクトリを削除するには、shutilモジュールのrmtree()を用います。

サポート、本当にありがとうございます。サポートしていただいた金額は、知的サイドハッスルとして取り組んでいる、個人研究の費用に充てさせていただきますね♪