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"
|