見出し画像

更新日を条件にして指定したフォルダに移動させるスクリプトを書いてみた

今日は、『新しいLinuxの教科書』での演習を通じて作成した、ファイルやディレクトリを整理するスクリプトに挑戦しようと思います。

やりたいこと

『新しいLinuxの教科書』の演習に取り組んでいた期間(2021年3月27日〜2021年4月6日)に更新したファイルやディレクトリをすべて一つのフォルダに移動させる

『新しいLinuxの教科書』の演習を進めていくうちに、/home/ユーザーのディレクトリにファイルやディレクトリが溜まっていきました。

なので、ここらで演習問題を解いている期間に作成(更新)したものを整理したいと思いました。

まず、手始めに1つのファイルを移動させる簡単なスクリプトを書いてみました。

import os
import shutil

# 移動先フォルダ「new_linux_text」を新規作成
os.mkdir('new_linux_text')
# ファイルを一つ移動させる
shutil.move('0001.txt', 'new_linux_test')

ファイル0001.txtは演習を通じて作成したファイルになります。

実行すると…

あれ、移動先「new_linux_text」の中身が空…

画像1

加えて、「new_linux_test」という名前のファイルが/home/ユーザーのところに新規作成されてます。

どうやら、

shutil.move('0001.txt', 'new_linux_text')

と、2つ目の引数にフォルダ名を正しく入れなければいけないところを、

shutil.move('0001.txt', 'new_linux_test')

と存在しないフォルダ名を指定したため、moveメソッドがファイルの移動ではなく、ファイル名の変更を実行したことが要因かと思われます。

気を取り直して、移動先フォルダ「new_linux_text」を削除し、ファイル「new_linux_test」の名前を「0001.txt」に戻した上で、shutil.moveの2つ目の引数を正しく指定してやり直しました。

実行すると、移動先フォルダ「new_linux_text」にファイル「0001.txt」が移動していることが確認できました♪

画像2

ディレクトリがない場合のみ、ディレクトリを作成する

if文によって、ディレクトリ「new_linux_text」が存在するか調べ、存在しない場合はディレクトリを作成し、存在する場合はディレクトリを作成しない処理を実現します。

# もし移動先フォルダ「new_linux_text」がなかったら、フォルダを新規作成
if os.path.isdir('new_linux_text') == False:
   os.mkdir('new_linux_text')

更新日のデータを取得する

続いて、ファイル「0001.txt」の更新日を取得します。
更新日を取得するには、osモジュールの「os.path.getmtime」関数を用います。

得られる結果は、秒単位のデータなので、日付データに変換する必要があります。
変換するには、datetimeモジュールの「datetime.fromtimestamp」関数を用います。

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

以上をまとめると、

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

import os
import shutil
from datetime import datetime, date

mtime = os.path.getmtime('0001.txt')
dt = datetime.fromtimestamp(mtime)
ddate = dt.date()

更新日が2021年3月27日以降かつ2021年4月6日以前であるならば、フォルダに移動

if文を用いて日付比較を行い、更新日が2021年3月27日以降かつ2021年4月6日以前ならば、ディレクトリ「new_linux_text」に移動するようにします。

# ファイルの更新日が2021年3月27日〜2021年4月6日であるならば、new_linux_textフォルダに移動
if ddate >= date(2021,3,27) and ddate <= date(2021,4,6):
   shutil.move('0001.txt', 'new_linux_text')

ファイルとディレクトリの一覧を取得

これまでは、一つのファイル(「0001.txt」)にのみディレクトリ移動の処理を行っていましたが、ディレクトリ「/home/ユーザー」内のすべてのファイル・ディレクトリに対して処理を行っていきます。

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

import os
import shutil
from datetime import datetime, date

dpath = '/home/toshiya/new_linux_text'
if os.path.isdir(dpath) == False:
   os.mkdir(dpath)
       
# ディレクトリ「home/ユーザー」内のすべてのファイルを取得する
files = os.listdir('/home/toshiya')
for file in files:
   mtime = os.path.getmtime(file)
   dt = datetime.fromtimestamp(mtime)
   ddate = dt.date()
   if ddate >= date(2021,3,27) and ddate <= date(2021,4,6):
       shutil.move(file, dpath)

for文で取得したすべてのファイル・ディレクトリに対して、更新日のチェックを行い、該当したファイルをディレクトリ「new_linux_text」に移動させてみました。

また、dpathという変数を用意して、そこに移動先のディレクトリの絶対パスを代入しました。

実は、『新しいLinuxの教科書』の演習において、ウェブサイトからダウンロードしたサンプルファイルが移動できていませんでした。こちらは更新日が「2015年4月6日」となっていたのが原因ですね。

それらのサンプルファイルも移動させるコードを追加しました。

import os
import shutil
from datetime import datetime, date

dpath = '/home/toshiya/new_linux_text'
if os.path.isdir(dpath) == False:
   os.mkdir(dpath)
       
files = os.listdir('/home/toshiya')
for file in files:
   mtime = os.path.getmtime(file)
   dt = datetime.fromtimestamp(mtime)
   ddate = dt.date()
   if ddate >= date(2021,3,27) and ddate <= date(2021,4,6):
       shutil.move(file, dpath)
   # 更新日が2015年4月6日ならば、移動させる
   if ddate == date(2015,4,6):
       shutil.move(file, dpath)

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