summaryrefslogtreecommitdiff
path: root/retention.sh
blob: b9bf8a727c9d3c4e350960f3a1b8d20e8c23e681 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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"