事前注意事項
・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"
コメント