Skip to content

指定時間を過ぎたファイルを削除するツール「purgo」

指定時間を過ぎ、古くなったファイルを削除するツール「purgo」を作成しました。Windows、macOS、Linuxで動作します。インストール方法や簡単な使い方をメモしておきます。

インストール

OSごとに以下のコマンドでインストールできます。

sudo curl -fsSL https://github.com/sig9org/purgo/releases/download/v0.0.2/purgo_v0.0.2_darwin_arm64 -o /usr/local/bin/purgo
sudo chmod +x /usr/local/bin/purgo
sudo curl -fsSL https://github.com/sig9org/purgo/releases/download/v0.0.2/purgo_v0.0.2_linux_amd64 -o /usr/local/bin/purgo
sudo chmod +x /usr/local/bin/purgo
sudo curl -fsSL https://github.com/sig9org/purgo/releases/download/v0.0.2/purgo_v0.0.2_linux_arm64 -o /usr/local/bin/purgo
sudo chmod +x /usr/local/bin/purgo

指定日を過ぎたファイルが削除されるか、ドライラン(テスト)実行で確認する

実際にはファイルを削除せず、ドライラン実行するには「--dryrun」オプションを指定します。「最終更新から3日以上、経過しているファイルが削除対象なのか、ドライラン実行で確認する」には以下のように実行します。

# purgo -d 3 --dryrun
[skip] 1day.txt (elapsed: 1d10h48m)
[skip] 2day.txt (elapsed: 2d10h48m)
[dry-run] 3day.txt (elapsed: 3d10h48m)
[dry-run] 4day.txt (elapsed: 4d10h48m)
[dry-run] 5day.txt (elapsed: 5d10h48m)
[dry-run] 6day.txt (elapsed: 6d10h48m)
[dry-run] 7day.txt (elapsed: 7d10h48m)

指定日を過ぎたファイルを削除する

実際に「最終更新から3日以上、経過しているファイルを削除する」には「-d 3」(または「--day 3」)を指定して実行します。実行前は以下のファイルがありました。

# ls -l
total 0
-rw-r--r-- 1 root root 0 Jul 23 00:00 1day.txt
-rw-r--r-- 1 root root 0 Jul 22 00:00 2day.txt
-rw-r--r-- 1 root root 0 Jul 21 00:00 3day.txt
-rw-r--r-- 1 root root 0 Jul 20 00:00 4day.txt
-rw-r--r-- 1 root root 0 Jul 19 00:00 5day.txt
-rw-r--r-- 1 root root 0 Jul 18 00:00 6day.txt
-rw-r--r-- 1 root root 0 Jul 17 00:00 7day.txt

purgoでファイルを削除してみます。

# purgo -d 3
[skip] 1day.txt (elapsed: 1d10h52m)
[skip] 2day.txt (elapsed: 2d10h52m)
[delete] 3day.txt (elapsed: 3d10h52m)
[delete] 4day.txt (elapsed: 4d10h52m)
[delete] 5day.txt (elapsed: 5d10h52m)
[delete] 6day.txt (elapsed: 6d10h52m)
[delete] 7day.txt (elapsed: 7d10h52m)

実行後は以下になっていました。「最終更新が3日未満」のファイルは残っていますが、それ以外は削除されたことが分かります。

# ls -l
total 0
-rw-r--r-- 1 root root 0 Jul 23 00:00 1day.txt
-rw-r--r-- 1 root root 0 Jul 22 00:00 2day.txt

削除対象のファイルを正規表現で指定する

以下のファイル群があったとします。

# ls -l
total 0
-rw-r--r-- 1 root root 0 Jul 23 00:00 1day.md
-rw-r--r-- 1 root root 0 Jul 23 00:00 1day.txt
-rw-r--r-- 1 root root 0 Jul 22 00:00 2day.md
-rw-r--r-- 1 root root 0 Jul 22 00:00 2day.txt
-rw-r--r-- 1 root root 0 Jul 21 00:00 3day.md
-rw-r--r-- 1 root root 0 Jul 21 00:00 3day.txt
-rw-r--r-- 1 root root 0 Jul 20 00:00 4day.md
-rw-r--r-- 1 root root 0 Jul 20 00:00 4day.txt
-rw-r--r-- 1 root root 0 Jul 19 00:00 5day.md
-rw-r--r-- 1 root root 0 Jul 19 00:00 5day.txt
-rw-r--r-- 1 root root 0 Jul 18 00:00 6day.md
-rw-r--r-- 1 root root 0 Jul 18 00:00 6day.txt
-rw-r--r-- 1 root root 0 Jul 17 00:00 7day.md
-rw-r--r-- 1 root root 0 Jul 17 00:00 7day.txt

正規表現を活用し、「5日以上経過しているMarkdownファイル(拡張子.md)」を削除してみます。

# purgo -d 5 '¥*.md'
[skip] 1day.md (elapsed: 1d10h58m)
[skip] 2day.md (elapsed: 2d10h58m)
[skip] 3day.md (elapsed: 3d10h58m)
[skip] 4day.md (elapsed: 4d10h58m)
[delete] 5day.md (elapsed: 5d10h58m)
[delete] 6day.md (elapsed: 6d10h58m)
[delete] 7day.md (elapsed: 7d10h58m)

実行後は以下になっていました。

# ls -l
total 0
-rw-r--r-- 1 root root 0 Jul 23 00:00 1day.md
-rw-r--r-- 1 root root 0 Jul 23 00:00 1day.txt
-rw-r--r-- 1 root root 0 Jul 22 00:00 2day.md
-rw-r--r-- 1 root root 0 Jul 22 00:00 2day.txt
-rw-r--r-- 1 root root 0 Jul 21 00:00 3day.md
-rw-r--r-- 1 root root 0 Jul 21 00:00 3day.txt
-rw-r--r-- 1 root root 0 Jul 20 00:00 4day.md
-rw-r--r-- 1 root root 0 Jul 20 00:00 4day.txt
-rw-r--r-- 1 root root 0 Jul 19 00:00 5day.txt
-rw-r--r-- 1 root root 0 Jul 18 00:00 6day.txt
-rw-r--r-- 1 root root 0 Jul 17 00:00 7day.txt

参考

テスト用ファイルの作成

Pythonでテスト用ファイルを作成するには以下を実行します。

1
2
3
4
for i in {1..7}; do
  t=$(python3 -c "import datetime; print((datetime.datetime.now() - datetime.timedelta(days=$i)).strftime('%Y%m%d0000'))")
  touch -t "$t" "${i}day.txt"
done

以下のファイルが作成されます。

# ls -l
total 0
-rw-r--r-- 1 root root 0 Jul 23 00:00 1day.txt
-rw-r--r-- 1 root root 0 Jul 22 00:00 2day.txt
-rw-r--r-- 1 root root 0 Jul 21 00:00 3day.txt
-rw-r--r-- 1 root root 0 Jul 20 00:00 4day.txt
-rw-r--r-- 1 root root 0 Jul 19 00:00 5day.txt
-rw-r--r-- 1 root root 0 Jul 18 00:00 6day.txt
-rw-r--r-- 1 root root 0 Jul 17 00:00 7day.txt

ヘルプ表示

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# purgo --help
usage: purgo [flags] [directory|regexp]

With no target, the current directory is scanned. If the target is an
existing directory, its files are scanned instead. Otherwise the target
is treated as a regular expression matched against file names in the
current directory.

Age threshold (at least one required):
  -y, --year int      years component of the age threshold
  -m, --month int     months component of the age threshold
  -d, --day int       days component of the age threshold
  -H, --hour int      hours component of the age threshold
  -M, --min int       minutes component of the age threshold

Other flags:
  -r, --recursive     search directories recursively
  -c, --created       use file creation time instead of last modified time
      --dryrun        report target files without deleting them
  -s, --silent        suppress printing of every scanned file's status and elapsed age
  -v, --version       print the version number and exit
  -h, --help          show this help message and exit