「自動起動するアプリケーションの設定」では、ログイン時に起動するアプリケーションを指定する事ができますが、Linux には、CRON という指定した時間に定期的にプログラムを実行してくれるデーモンが存在します。システムのCRONデーモンが定期的に実行するスクリプトは以下にそれぞれ格納されており、配下にあるファイルの中身をみてもえれば分かると思いますが、システムのメンテナンス、クリーナップなどを定期的に行ってくれます。
/etc/cron.d/ 日時指定毎
/etc/cron.hourly/ 1時間毎
/etc/cron.daily/ 1日毎
/etc/cron.weekly/ 週間毎
/etc/cron.monthly/ 月毎
これらのシステム自体の設定とは別に、ユーザ毎に設定を行いCRONデーモンに定期的にプログラムを実行させる事もできます。今回は、ホームディレクトリにある「~/ピクチャ/」ディレクトリにある画像ファイルを定期的に整理するスクリプトの設定方法を紹介したいと思います。
~/ピクチャ/ は、画像ファイルを保存しておくディレクトリですが、ブラウザからダウンロードした画像ファイル、スクリーンキャプチャ、外部から取り込んだ写真など整理が大変になりがちです。写真の画像ファイル名には通常日付が含まれているので、その日付毎にディレクトリを作成してファイルを移動する、ファイル名に日付が含まれていない場合は、ファイルの更新日のディレクトリに移動するスクリプトを作成してみました。
# ~/ピクチャ/ の中を参照すると日付がバラバラのファイルが沢山あります。
$ cd ~/ピクチャ/
$ ls
P_20210419_160003.jpg 'Screenshot from 2021-04-26 10-20-45.png' organize_pictures.sh
P_20210420_160003.jpg 'Screenshot from 2021-04-26 16-51-58.png' sample0.jpeg
'Screenshot from 2021-04-25 06-40-27.png' 'Screenshot from 2021-04-28 10-24-13.png' sample1.jpeg
'Screenshot from 2021-04-25 06-40-44.png' 'Screenshot from 2021-04-28 11-41-17.png'
# ./organize_pictures.sh を実行します。
$ ./organize_pictures.sh
# 2021 ディレクトリと organize_pictures.sh ファイルだけになりました。
$ ls
2021 organize_pictures.sh
# 2021 配下を参照すると日付ごとにファイルが分けられた事が分かります。
$ find 2021/
2021/
2021/04
2021/04/26
2021/04/26/Screenshot from 2021-04-26 16-51-58.png
2021/04/26/Screenshot from 2021-04-26 10-20-45.png
2021/04/20
2021/04/20/P_20210420_160003.jpg
2021/04/19
2021/04/19/P_20210419_160003.jpg
2021/04/25
2021/04/25/Screenshot from 2021-04-25 06-40-44.png
2021/04/25/Screenshot from 2021-04-25 06-40-27.png
2021/04/28
2021/04/28/sample1.jpeg
2021/04/28/Screenshot from 2021-04-28 11-41-17.png
2021/04/28/Screenshot from 2021-04-28 10-24-13.png
2021/04/28/sample0.jpeg
organize_pictures.sh
#!/bin/bash
cd /home/${USER}/ピクチャ
# 実行したディレクトリにある、拡張子 png, jpg, jpeg ファイルの一覧を取得する。
for file in `ls *.[Pp][Nn][Gg] *.[Jj][Pp][Gg] *.[Jj][Pp][Ee][Gg] 2>/dev/null`
do
# ファイル名が
# XXX_20210601_XXX.png
# XXX_2021-06-01_XXX.jpg
# XXX_2021_06_01_XXX.jpeg
# などのファイルから日にちを抽出する。
# FILEDATE には 2021 06 01 等の値が入る
FILEDATE=`echo "${file}" |sed -r 's/.*(20[0-9][0-9])-?_?([0-9][0-9])-?_?([0-3][0-9]).*/\1 \2 \3/'`
# パターンにマッチしないと FILEDATE にファイル名が入るので file と同じ値になる
if [ "${FILEDATE}" == "${file}" ]; then
# ファイル名に日付が無い場合はファイルのタイムスタンプを取得してその日付を利用する。
FILEDATE=`date "+%Y %m %d" -r "${file}"`
fi
YEAR=`echo ${FILEDATE}|awk '{print $1}'` # 2021 06 01 から 2021 を取得
MONTH=`echo ${FILEDATE}|awk '{print $2}'` # 2021 06 01 から 06 を取得
DAY=`echo ${FILEDATE}|awk '{print $3}'` # 2021 06 01 から 01 を取得
# ./2021/06/01 のディレクトリが存在するか確認して無ければ作成する。
if [ ! -d "./${YEAR}/${MONTH}/${DAY}" ]; then
mkdir -p "./${YEAR}/${MONTH}/${DAY}"
fi
# ファイルを日付ごとのディレクトリに移動する。
mv "${file}" "./${YEAR}/${MONTH}/${DAY}"
done
CRON の設定は以下のように記述します。
# 設定一覧を表示する
$ crontab -l
# 設定ファイルを開く
$ crontab -e
* * * * * (コマンド)
左端から * の頻度、指定できる数字
「*」の位置(左端から)頻度 指定できる数字
1番目 分 0-59
2番目 時 0-23
3番目 日 1-31
4番目 月 1-12
5番目 曜日 0-7 (0と7は日曜日)
例えば以下のように記述すると毎月1日、午前6時3分に script.sh を実行する。
3 6 1 * * script.sh
また,-/で区切り文字を使い以下のように細かい設定も可能です。
毎月1,10,20日の午前6時3分に script.sh を実行する。
3 6 1,10,20 * * script.sh
2時間毎の毎時0分に script.sh を実行する。
0 */2 * * * script.sh
9〜18時の毎時0分に script.sh を実行する。
0 9-18 * * * script.sh
先程のスクリプトを毎時0分に実行したい場合は以下のようにするだけです。画像ファイルを「~/ピクチャ/」ディレクトリに保存するだけでファイルが定期的に整理されるようになります。
0 */1 * * * cd /home/${USER}/ピクチャ/ && ./organize_pictures.sh