diff options
author | doc <doc@filenotfound.org> | 2025-06-30 20:11:52 +0000 |
---|---|---|
committer | doc <doc@filenotfound.org> | 2025-06-30 20:11:52 +0000 |
commit | 41e897f4945aaf8fbcdf0b12ac2f08c5e6ae0458 (patch) | |
tree | db7c3520fd91abc3cf56b1a52095d23f3a80d059 /retention.sh |
Diffstat (limited to 'retention.sh')
-rwxr-xr-x | retention.sh | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/retention.sh b/retention.sh new file mode 100755 index 0000000..b9bf8a7 --- /dev/null +++ b/retention.sh @@ -0,0 +1,71 @@ +#!/bin/bash + +SRC_BASE="/mnt/convert/archives" +DEST_BASE="/mnt/5tb/archives" +RETENTION_MONTHS=3 +TODAY=$(date +%s) + +LOG_FILE="/var/log/archive_retention.log" + +# Log start of run +echo "=== Archive Sync: $(date) ===" >> "$LOG_FILE" + +# Init counters +files_checked=0 +files_archived=0 +files_deleted=0 + +# Traverse all subfolders +find "$SRC_BASE" -type f -name '*.mp3' | while read -r file; do + ((files_checked++)) + + filename=$(basename "$file") + relative_path=$(realpath --relative-to="$SRC_BASE" "$file") + subfolder=$(dirname "$relative_path") + dest_folder="$DEST_BASE/$subfolder" + dest_file="$dest_folder/$filename" + + # --- Date extraction logic (supports YYYY-MM-DD or YYYYMMDD) --- + file_date=$(echo "$filename" | grep -oP '\d{4}-\d{2}-\d{2}') + + if [ -z "$file_date" ]; then + raw_date=$(echo "$filename" | grep -oP '\d{8}') + if [ ! -z "$raw_date" ]; then + file_date="${raw_date:0:4}-${raw_date:4:2}-${raw_date:6:2}" + fi + fi + + if [ -z "$file_date" ]; then + echo "Skipping (no valid date found): $filename" >> "$LOG_FILE" + continue + fi + + file_epoch=$(date -d "$file_date" +%s 2>/dev/null) + if [ -z "$file_epoch" ]; then + echo "Skipping (invalid date format): $filename" >> "$LOG_FILE" + continue + fi + + age_months=$(( (TODAY - file_epoch) / 2592000 )) + + # Make sure destination folder exists + mkdir -p "$dest_folder" + + if [ "$age_months" -le "$RETENTION_MONTHS" ]; then + if [ ! -f "$dest_file" ]; then + echo "Archiving: $filename → $dest_folder" >> "$LOG_FILE" + cp "$file" "$dest_file" + ((files_archived++)) + fi + else + if [ -f "$dest_file" ]; then + echo "Deleting expired: $filename" >> "$LOG_FILE" + rm "$dest_file" + ((files_deleted++)) + fi + fi +done + +# Final summary log +echo "Checked: $files_checked | Archived: $files_archived | Deleted: $files_deleted" >> "$LOG_FILE" +echo "" >> "$LOG_FILE" |