72 lines
2.0 KiB
Bash
Raw Normal View History

#!/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"