OneDriveデータの自動削除シェルスクリプト作成の手順と定期実行の設定方法

プログラム

事前注意事項
・rclone使ってます
※ファイルはゴミ箱に送られます。ゴミ箱からUI以外でユーザー契機の削除は出来ないらしいです
 (できる方法あったら教えて下さい…)

・先々月のデータを対象にしています
 ゴミ箱の削除は30日後にされるみたいなので(OneDrive仕様)、完全に削除されるのは3か月後となります。

ほぼほぼChatGPTさんに作ってもらいました。
凄いですね…

たまにエラー吐いたらそれ送れば直してくれました。
あとは自分で直した方が早い部分は直してレビューしてもらったりしました。

スクリプト内容

#!/bin/bash

# 設定
REMOTE_NAME=""
REMOTE_PATH=""

# 日付の計算
CURRENT_YEAR=$(date +'%Y')
CURRENT_MONTH=$(date +'%m')
LOG_DIR="$HOME/delete_log"

if [ "$CURRENT_MONTH" -eq "01" ]; then
    PREV_YEAR=$((CURRENT_YEAR - 1))
    PREV_MONTH="11"
elif [ "$CURRENT_MONTH" -eq "02" ]; then
    PREV_YEAR=$((CURRENT_YEAR - 1))
    PREV_MONTH="12"
else
    PREV_YEAR=$CURRENT_YEAR
    PREV_MONTH=$(printf "%02d" $((CURRENT_MONTH - 2)))
fi

PREV_MONTH_PREFIX="${PREV_YEAR}${PREV_MONTH}"

# ログファイルのパスを設定
TIMESTAMP=$(date +'%Y%m%d_%H%M%S')
LOG_FILE="${LOG_DIR}/${TIMESTAMP}_delete.log"

# ログディレクトリが存在しない場合、作成
if [ ! -d "$LOG_DIR" ]; then
    mkdir -p "$LOG_DIR"
fi

# 一時ファイル
TEMP_FILE=$(mktemp)

# ファイルリストを取得
rclone ls "$REMOTE_NAME:$REMOTE_PATH" > "$TEMP_FILE"

# 前月のファイルをフィルタリングし、ファイル名のみを取得
FILES=$(grep "[0-9]* worlds_${PREV_MONTH_PREFIX}[0-9]\{2\}_[0-9]\{6\}\.tar\.gz" "$TEMP_FILE" | awk '{print $2}')

# 最初と最後のファイルを特定
FIRST_FILE=$(echo "$FILES" | head -n 1)
LAST_FILE=$(echo "$FILES" | tail -n 1)

# 削除するファイルをリストアップ
FILES_TO_DELETE=$(echo "$FILES" | grep -v -e "$FIRST_FILE" -e "$LAST_FILE")

# ファイルを削除
echo "settings: { REMOTE_NAME: $REMOTE_NAME, REMOTE_PATH: $REMOTE_PATH }" >> "$LOG_FILE"
echo "delefe files :" >> "$LOG_FILE"
for FILE in $FILES_TO_DELETE; do
    rclone delete "$REMOTE_NAME:$REMOTE_PATH/$FILE"
    echo "$FILE" >> "$LOG_FILE"
done

# 一時ファイルを削除
rm "$TEMP_FILE"

定期実行(crontab)

crontab -e に以下を登録して月次実行にしました

0 0 1 * * sh fresh_onedrive.sh && rclone copy /home/ubuntu/delete_log od:delete_log

・fresh_onedrive.sh :上記シェルの名前(実行ユーザーのホームディレクトリに配置)
・/home/ubuntu/delete_log :実行ログのディレクトリ
・od:delete_log :OneDrive側の実行ログ保存場所

最初のプロンプト

ちなみに最初に送ったプロンプトはこんな感じです

rclone ls の実行結果例を表示してください

くれた内容はこんな感じです


前月のデータを対象とし、その月の最初と最後のファイルのみを残して他を削除するシェルスクリプトを作成するには、以下の手順を踏む必要があります。

現在の年月を取得し、前月の年月を計算します。
rclone lsコマンドでファイルリストを取得します。
前月に該当するファイルをフィルタリングします。
前月の最初と最後のファイルを特定し、それ以外を削除します。
以下は、この手順に従ったシェルスクリプトの例です:

bash
コードをコピーする
#!/bin/bash

# 設定
REMOTE_NAME="remote"
REMOTE_PATH="path/to/files"

# 日付の計算
CURRENT_YEAR=$(date +'%Y')
CURRENT_MONTH=$(date +'%m')

if [ "$CURRENT_MONTH" -eq "01" ]; then
    PREV_YEAR=$((CURRENT_YEAR - 1))
    PREV_MONTH="12"
else
    PREV_YEAR=$CURRENT_YEAR
    PREV_MONTH=$(printf "%02d" $((10#$CURRENT_MONTH - 1)))
fi

PREV_MONTH_PREFIX="${PREV_YEAR}${PREV_MONTH}"

# 一時ファイル
TEMP_FILE=$(mktemp)

# ファイルリストを取得
rclone ls "$REMOTE_NAME:$REMOTE_PATH" > "$TEMP_FILE"

# 前月のファイルをフィルタリング
FILES=$(grep "worlds_${PREV_MONTH_PREFIX}[0-9]\{6\}_[0-9]\{6\}\.tar\.gz" "$TEMP_FILE")

# 最初と最後のファイルを特定
FIRST_FILE=$(echo "$FILES" | head -n 1 | awk '{print $2}')
LAST_FILE=$(echo "$FILES" | tail -n 1 | awk '{print $2}')

# 削除するファイルをリストアップ
FILES_TO_DELETE=$(echo "$FILES" | awk '{print $2}' | grep -v -e "$FIRST_FILE" -e "$LAST_FILE")

# ファイルを削除
for FILE in $FILES_TO_DELETE; do
    rclone delete "$REMOTE_NAME:$REMOTE_PATH/$FILE"
done

# 一時ファイルを削除
rm "$TEMP_FILE"
このスクリプトは次のことを行います:

現在の年月を取得し、前月の年月を計算します。
rclone lsコマンドを使用して、指定されたリモートパス内のすべてのファイルをリストアップします。
前月に該当するファイルをフィルタリングします。
前月の最初のファイルと最後のファイルを特定します。
前月の最初のファイルと最後のファイルを除くすべてのファイルを削除します。
スクリプトを実行する前に、REMOTE_NAMEとREMOTE_PATHをあなたの環境に合わせて設定してください。

実行したらエラーこんな吐いたんで色々直してもらいました。

16: arithmetic expression: expecting EOF: "10#06 - 1"

コメント

タイトルとURLをコピーしました