デスクトップを綺麗にしたい～Pythonで不要ファイル自動削除～

# デスクトップが汚くなってきた...
ファイルとショートカットだらけになってきた。
![dirty_desktop.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305855/02f5acff-910b-4121-9b74-fc58addb7e1f.jpeg)


ファイルを片付けるのもめんどくさい。
対策として以下のことを試すことにした。

1. 一時的に使用するファイルを`\tmp`フォルダにまとめる
1. 大切なファイルはオンラインストレージにバックアップする（手動）
1. **`\tmp`フォルダにあるファイルのうち、一週間以上使っていないファイルは自動で削除**

3.をPythonで書いた。
<br>

# 完成！「ファイル自動削除くん.bat」

## 使い方

1. 不要ファイルを削除したいフォルダに`ファイル自動削除くん.bat`を入れる（お好きな場所にどうぞ）
![where_to_place.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305855/8b694fb4-5a77-b4cc-284a-d243de967b18.png)

2. `.bat`をダブルクリックして実行
3. **一週間以上アクセスしていないファイルがすべて削除される**
![executed-1597238348957.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305855/b0d51fb0-a9ef-d3cb-dae6-f89f14153c5c.jpeg)
<br>

## コード

Gistにも上げた（シンタックスハイライトのために.pyにしてる）→　[dannyso16/delete_unused_files.py](https://gist.github.com/dannyso16/c1bdad2dd56aa6d1a96a5c1d052c3b64)

ただしプログラムは以下の環境で作った。

- Windows 10 Education
- Python 3.7

PythonプログラムはMacやLinuxでも動作する(はず)です。コードはやや新しいPythonの書き方をしている部分があるので3.6以降だと安心です。
以下完成したコード(`.bat`ファイルにPythonプログラムを書いている)

```python
REM = r"""
SET PYTHON_EXE="python.exe"
%PYTHON_EXE% %0 %1
PAUSE
EXIT
"""

import os
import glob
import time
import send2trash

root_dir = os.path.abspath(os.path.dirname(__file__))
os.chdir(root_dir)

files = glob.glob("./**")
print(f"{len(files)} files here.")
print(files)
current_time = time.time()

print("Now deleting unused files...")
for f in files:
    name, ext = os.path.splitext(f)
    if ext == ".bat":
        continue
    atime = os.path.getatime(f)  # last access time
    ctime = os.path.getctime(f)  # last metadata change time
    mtime = os.path.getmtime(f)  # last modification time

    # delete file which you don't access within a week
    days_from_last_access = (current_time - atime)/3600/24
    if (days_from_last_access >= 7):
        send2trash.send2trash(f)
        print(f"--- {f}")

print("Completed.")

```

<br>

# コードの工夫ポイント

多くは[第38回ゼロからはじめるPython「Pythonで不要ファイルを一括削除しよう」](https://news.mynavi.jp/article/zeropython-38/)を参考にしている。

## 1. ゴミ箱に移す

`os.remove`ではファイルが完全に消え去ってしまうので念のためゴミ箱に移す。Pythonでは**Send2trash**が便利でWindowsだけでなくMacやLinuxでも、よしなにやってくれる。

```python
# pip install Send2Trash しましょう
import send2trash

# ゴミ箱に入れる
send2trash.send2trash('/path/of/file')
```

<br>

## 2. batファイルをどこでも実行できるようにする

最初は「どうせデスクトップで使うし…」と思ってパスをべた書きしてた。

```python
root_dir = "./path/for/desktop/tmp"
以下略
```

しかし不要なファイルがたまるのはデスクトップだけでない。ゴミ箱と化している「ダウンロード フォルダ」やスクショをためる「ピクチャ フォルダ」も掃除したかったので、**`.bat`のファイルがある場所にカレントディレクトリを設定するようにした。**

```python
root_dir = os.path.abspath(os.path.dirname(__file__))
os.chdir(root_dir)
```

<br>

## 3. 消す条件はお好きにどうぞ

ファイルを削除する部分を抜粋する。

```python
for f in files:
    name, ext = os.path.splitext(f)
    if ext == ".bat":
        continue
    atime = os.path.getatime(f)  # last access time
    ctime = os.path.getctime(f)  # last metadata change time
    mtime = os.path.getmtime(f)  # last modification time

    # delete file which you don't access within a week
    days_from_last_access = (current_time - atime)/3600/24
    if (days_from_last_access >= 7):
        send2trash.send2trash(f)
        print(f"--- {f}")
```

ここでは

- 拡張子`.bat`は削除しない
- 7日間**アクセスしていない**ファイルを削除する

ようにした。お好みで「〇日間**編集していない**ファイルを削除する」などに変えて使ってください。

<br>

# 最後に

小さい自動化でも結構たのしいし、定期実行するように設定しておけば便利そう。「もっと簡単にデスクトップをきれいにするやり方があるよ」とか「コードはこう書くといいよ」はGist上かQiitaで気軽に教えてください。

あとどうでもいいけど、**デスクトップはとってもきれいになりました。**
![desktop.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305855/71d5e7d2-fbfa-8c4d-4636-1ca67e40d49d.jpeg)
**Just Do It !!　極度掃除(しなさい)**

これは以下のツイートに影響されています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">大事なファイルがどこにあるか忘れる事が多いんだけど壁紙これに変えたらそれがきっぱり無くなったのでオススメ <a href="https://t.co/gwznsux0P2">pic.twitter.com/gwznsux0P2</a></p>&mdash; とらうとさぁもん (@Harpuia_tomo) <a href="https://twitter.com/Harpuia_tomo/status/1175713714353233920?ref_src=twsrc%5Etfw">September 22, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<br>

# 参考

[第38回ゼロからはじめるPython「Pythonで不要ファイルを一括削除しよう」](https://news.mynavi.jp/article/zeropython-38/)

[dannyso16/delete_unused_files.py](https://gist.github.com/dannyso16/c1bdad2dd56aa6d1a96a5c1d052c3b64)