Refine backup script
This commit is contained in:
@@ -1,35 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
DOCKER_DIR="/lvm1/docker"
|
||||
CONTAINER_NAME="adguardhome"
|
||||
CONTAINER_DIR="$DOCKER_DIR/$CONTAINER_NAME"
|
||||
SAVE_PATH="/media/backup/backup_docker/$CONTAINER_NAME/files"
|
||||
NOW_DATETIME="$(date +'%Y%m%d_%H%M%S')"
|
||||
BACKUP_FILENAME="backup_${CONTAINER_NAME}_$NOW_DATETIME.tar"
|
||||
BACKUP_FILE_PATH="$SAVE_PATH/$BACKUP_FILENAME"
|
||||
BACKUP_CMD="sudo tar cvf $BACKUP_FILENAME $CONTAINER_NAME"
|
||||
|
||||
echo "DOCKER_DIR: $DOCKER_DIR"
|
||||
echo "CONTAINER_DIR: $CONTAINER_DIR"
|
||||
echo "SAVE_PATH: $SAVE_PATH"
|
||||
echo "NOW_DATETIME: $NOW_DATETIME"
|
||||
echo "BACKUP_FILENAME: $BACKUP_FILENAME"
|
||||
echo "BACKUP_FILE_PATH: $BACKUP_FILE_PATH"
|
||||
echo "BACKUP_CMD: $BACKUP_CMD"
|
||||
echo "$(date +'%F %R:%S'): Backup start. BACKUP_CMD = $BACKUP_CMD"
|
||||
|
||||
mkdir -p $SAVE_PATH
|
||||
sudo docker compose -f ${CONTAINER_DIR}/docker-compose.yml down
|
||||
cd $DOCKER_DIR
|
||||
$BACKUP_CMD
|
||||
sudo docker compose -f ${CONTAINER_DIR}/docker-compose.yml up -d
|
||||
|
||||
## Move BACKUP_FILENAME to BACKUP_FILE_PATH
|
||||
echo "rsync -ah --progress $BACKUP_FILENAME $SAVE_PATH"
|
||||
rsync -ah --progress $BACKUP_FILENAME $SAVE_PATH
|
||||
|
||||
## Delete local backup file
|
||||
echo "rm $BACKUP_FILENAME"
|
||||
rm -f $BACKUP_FILENAME
|
||||
|
||||
echo "$(date +'%F %R:%S'): Backup finished."
|
||||
74
backup_docker.sh
Executable file
74
backup_docker.sh
Executable file
@@ -0,0 +1,74 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Check if container name is provided
|
||||
if [ -z "$1" ]; then
|
||||
echo "Usage: $0 <container_name> [--exclude=<DIR_NAME>]"
|
||||
echo "Example: $0 immich"
|
||||
echo "Example: $0 immich --exclude=immich/nasphoto"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DOCKER_DIR="/DATA01/dockers"
|
||||
CONTAINER_NAME="$1"
|
||||
CONTAINER_DIR="$DOCKER_DIR/$CONTAINER_NAME"
|
||||
EXCLUDE_OPTION=""
|
||||
|
||||
# Parse exclude option if provided
|
||||
if [ -n "$2" ]; then
|
||||
case "$2" in
|
||||
--exclude=*)
|
||||
EXCLUDE_DIR="${2#--exclude=}"
|
||||
EXCLUDE_OPTION="--exclude $EXCLUDE_DIR"
|
||||
;;
|
||||
*)
|
||||
echo "錯誤: 無效的參數: $2"
|
||||
echo "Usage: $0 <container_name> [--exclude=<DIR_NAME>]"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Check if container directory exists
|
||||
if [ ! -d "$CONTAINER_DIR" ]; then
|
||||
echo "錯誤: 容器目錄不存在: $CONTAINER_DIR"
|
||||
echo "無法備份一個目錄不存在的 docker"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "$(date +'%F %R:%S'): Backup start."
|
||||
SAVE_PATH="/nas/Backup/backup_docker/$CONTAINER_NAME/files"
|
||||
NOW_DATETIME="$(date +'%Y%m%d_%H%M%S')"
|
||||
BACKUP_FILENAME="backup_${CONTAINER_NAME}_$NOW_DATETIME.tar"
|
||||
BACKUP_FILE_PATH="$SAVE_PATH/$BACKUP_FILENAME"
|
||||
BACKUP_CMD="sudo tar -cv $EXCLUDE_OPTION -f $BACKUP_FILENAME $CONTAINER_NAME"
|
||||
|
||||
echo "DOCKER_DIR: $DOCKER_DIR"
|
||||
echo "CONTAINER_DIR: $CONTAINER_DIR"
|
||||
echo "SAVE_PATH: $SAVE_PATH"
|
||||
echo "NOW_DATETIME: $NOW_DATETIME"
|
||||
echo "BACKUP_FILENAME: $BACKUP_FILENAME"
|
||||
echo "BACKUP_FILE_PATH: $BACKUP_FILE_PATH"
|
||||
echo "BACKUP_CMD: $BACKUP_CMD"
|
||||
echo "$(date +'%F %R:%S'): Backup start. BACKUP_CMD = $BACKUP_CMD"
|
||||
echo pwd=$(pwd)
|
||||
|
||||
mkdir -p $SAVE_PATH
|
||||
|
||||
## Clean up old backups before creating new one, keep only the newest 4 files
|
||||
echo "$(date +'%F %R:%S'): Cleaning up old backups before backup..."
|
||||
/home/awin/scripts/newestN.sh -d="$SAVE_PATH" -n=4 --confirm=0
|
||||
|
||||
sudo docker compose -f ${CONTAINER_DIR}/docker-compose.yml down
|
||||
cd $DOCKER_DIR
|
||||
$BACKUP_CMD
|
||||
sudo docker compose -f ${CONTAINER_DIR}/docker-compose.yml up -d
|
||||
|
||||
## Move BACKUP_FILENAME to BACKUP_FILE_PATH
|
||||
echo "rsync -avh --progress $BACKUP_FILENAME $SAVE_PATH"
|
||||
rsync -ah --progress $BACKUP_FILENAME $SAVE_PATH
|
||||
|
||||
## Delete local backup file
|
||||
echo "rm $BACKUP_FILENAME"
|
||||
rm -f $BACKUP_FILENAME
|
||||
|
||||
echo "$(date +'%F %R:%S'): Backup finished."
|
||||
@@ -1,18 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
BACKUP_FOLDER=/media/backup/backup_awin-pc2/dotfiles/
|
||||
BACKUP_ITEMS=(
|
||||
'/home/awin/.bashrc'
|
||||
'/home/awin/.config'
|
||||
'/home/awin/.ssh'
|
||||
'/home/awin/.vimrc'
|
||||
|
||||
)
|
||||
|
||||
for item in "${BACKUP_ITEMS[@]}"
|
||||
do
|
||||
cp -r -p $item $BACKUP_FOLDER
|
||||
done
|
||||
|
||||
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
DOCKER_DIR="/lvm1/docker"
|
||||
CONTAINER_NAME="filebrowser"
|
||||
CONTAINER_DIR="$DOCKER_DIR/$CONTAINER_NAME"
|
||||
SAVE_PATH="/media/backup/backup_docker/$CONTAINER_NAME/files"
|
||||
NOW_DATETIME="$(date +'%Y%m%d_%H%M%S')"
|
||||
BACKUP_FILENAME="backup_${CONTAINER_NAME}_$NOW_DATETIME.tar"
|
||||
BACKUP_FILE_PATH="$SAVE_PATH/$BACKUP_FILENAME"
|
||||
BACKUP_CMD="sudo tar cvf $BACKUP_FILENAME $CONTAINER_NAME"
|
||||
|
||||
echo "DOCKER_DIR: $DOCKER_DIR"
|
||||
echo "CONTAINER_DIR: $CONTAINER_DIR"
|
||||
echo "SAVE_PATH: $SAVE_PATH"
|
||||
echo "NOW_DATETIME: $NOW_DATETIME"
|
||||
echo "BACKUP_FILENAME: $BACKUP_FILENAME"
|
||||
echo "BACKUP_FILE_PATH: $BACKUP_FILE_PATH"
|
||||
echo "BACKUP_CMD: $BACKUP_CMD"
|
||||
echo "$(date +'%F %R:%S'): Backup start. BACKUP_CMD = $BACKUP_CMD"
|
||||
|
||||
mkdir -p $SAVE_PATH
|
||||
sudo docker compose -f ${CONTAINER_DIR}/docker-compose.yml down
|
||||
cd $DOCKER_DIR
|
||||
$BACKUP_CMD
|
||||
sudo docker compose -f ${CONTAINER_DIR}/docker-compose.yml up -d
|
||||
|
||||
## Move BACKUP_FILENAME to BACKUP_FILE_PATH
|
||||
echo "rsync -ah --progress $BACKUP_FILENAME $SAVE_PATH"
|
||||
rsync -ah --progress $BACKUP_FILENAME $SAVE_PATH
|
||||
|
||||
## Delete local backup file
|
||||
echo "rm $BACKUP_FILENAME"
|
||||
rm -f $BACKUP_FILENAME
|
||||
|
||||
echo "$(date +'%F %R:%S'): Backup finished."
|
||||
@@ -1,35 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
DOCKER_DIR="/lvm1/docker"
|
||||
CONTAINER_NAME="freshrss"
|
||||
CONTAINER_DIR="$DOCKER_DIR/$CONTAINER_NAME"
|
||||
SAVE_PATH="/media/backup/backup_docker/$CONTAINER_NAME/files"
|
||||
NOW_DATETIME="$(date +'%Y%m%d_%H%M%S')"
|
||||
BACKUP_FILENAME="backup_${CONTAINER_NAME}_$NOW_DATETIME.tar"
|
||||
BACKUP_FILE_PATH="$SAVE_PATH/$BACKUP_FILENAME"
|
||||
BACKUP_CMD="sudo tar cvf $BACKUP_FILENAME $CONTAINER_NAME"
|
||||
|
||||
echo "DOCKER_DIR: $DOCKER_DIR"
|
||||
echo "CONTAINER_DIR: $CONTAINER_DIR"
|
||||
echo "SAVE_PATH: $SAVE_PATH"
|
||||
echo "NOW_DATETIME: $NOW_DATETIME"
|
||||
echo "BACKUP_FILENAME: $BACKUP_FILENAME"
|
||||
echo "BACKUP_FILE_PATH: $BACKUP_FILE_PATH"
|
||||
echo "BACKUP_CMD: $BACKUP_CMD"
|
||||
echo "$(date +'%F %R:%S'): Backup start. BACKUP_CMD = $BACKUP_CMD"
|
||||
|
||||
mkdir -p $SAVE_PATH
|
||||
sudo docker compose -f ${CONTAINER_DIR}/docker-compose.yml down
|
||||
cd $DOCKER_DIR
|
||||
$BACKUP_CMD
|
||||
sudo docker compose -f ${CONTAINER_DIR}/docker-compose.yml up -d
|
||||
|
||||
## Move BACKUP_FILENAME to BACKUP_FILE_PATH
|
||||
echo "rsync -ah --progress $BACKUP_FILENAME $SAVE_PATH"
|
||||
rsync -ah --progress $BACKUP_FILENAME $SAVE_PATH
|
||||
|
||||
## Delete local backup file
|
||||
echo "rm $BACKUP_FILENAME"
|
||||
rm -f $BACKUP_FILENAME
|
||||
|
||||
echo "$(date +'%F %R:%S'): Backup finished."
|
||||
@@ -1,35 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
DOCKER_DIR="/lvm1/docker"
|
||||
CONTAINER_NAME="gitea"
|
||||
CONTAINER_DIR="$DOCKER_DIR/$CONTAINER_NAME"
|
||||
SAVE_PATH="/media/backup/backup_docker/$CONTAINER_NAME/files"
|
||||
NOW_DATETIME="$(date +'%Y%m%d_%H%M%S')"
|
||||
BACKUP_FILENAME="backup_${CONTAINER_NAME}_$NOW_DATETIME.tar"
|
||||
BACKUP_FILE_PATH="$SAVE_PATH/$BACKUP_FILENAME"
|
||||
BACKUP_CMD="sudo tar cvf $BACKUP_FILENAME $CONTAINER_NAME"
|
||||
|
||||
echo "DOCKER_DIR: $DOCKER_DIR"
|
||||
echo "CONTAINER_DIR: $CONTAINER_DIR"
|
||||
echo "SAVE_PATH: $SAVE_PATH"
|
||||
echo "NOW_DATETIME: $NOW_DATETIME"
|
||||
echo "BACKUP_FILENAME: $BACKUP_FILENAME"
|
||||
echo "BACKUP_FILE_PATH: $BACKUP_FILE_PATH"
|
||||
echo "BACKUP_CMD: $BACKUP_CMD"
|
||||
echo "$(date +'%F %R:%S'): Backup start. BACKUP_CMD = $BACKUP_CMD"
|
||||
|
||||
mkdir -p $SAVE_PATH
|
||||
sudo docker compose -f ${CONTAINER_DIR}/docker-compose.yml down
|
||||
cd $DOCKER_DIR
|
||||
$BACKUP_CMD
|
||||
sudo docker compose -f ${CONTAINER_DIR}/docker-compose.yml up -d
|
||||
|
||||
## Move BACKUP_FILENAME to BACKUP_FILE_PATH
|
||||
echo "rsync -ah --progress $BACKUP_FILENAME $SAVE_PATH"
|
||||
rsync -ah --progress $BACKUP_FILENAME $SAVE_PATH
|
||||
|
||||
## Delete local backup file
|
||||
echo "rm $BACKUP_FILENAME"
|
||||
rm -f $BACKUP_FILENAME
|
||||
|
||||
echo "$(date +'%F %R:%S'): Backup finished."
|
||||
@@ -1,38 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
echo "$(date +'%F %R:%S'): Backup start."
|
||||
|
||||
DOCKER_DIR="/lvm1/docker"
|
||||
CONTAINER_NAME="immich"
|
||||
CONTAINER_DIR="$DOCKER_DIR/$CONTAINER_NAME"
|
||||
SAVE_PATH="/media/backup/backup_docker/$CONTAINER_NAME/files"
|
||||
NOW_DATETIME="$(date +'%Y%m%d_%H%M%S')"
|
||||
BACKUP_FILENAME="backup_${CONTAINER_NAME}_$NOW_DATETIME.tar"
|
||||
BACKUP_FILE_PATH="$SAVE_PATH/$BACKUP_FILENAME"
|
||||
BACKUP_CMD="sudo tar -cv --exclude immich/nasphoto -f $BACKUP_FILENAME $CONTAINER_NAME"
|
||||
|
||||
echo "DOCKER_DIR: $DOCKER_DIR"
|
||||
echo "CONTAINER_DIR: $CONTAINER_DIR"
|
||||
echo "SAVE_PATH: $SAVE_PATH"
|
||||
echo "NOW_DATETIME: $NOW_DATETIME"
|
||||
echo "BACKUP_FILENAME: $BACKUP_FILENAME"
|
||||
echo "BACKUP_FILE_PATH: $BACKUP_FILE_PATH"
|
||||
echo "BACKUP_CMD: $BACKUP_CMD"
|
||||
echo "$(date +'%F %R:%S'): Backup start. BACKUP_CMD = $BACKUP_CMD"
|
||||
echo pwd=$(pwd)
|
||||
|
||||
mkdir -p $SAVE_PATH
|
||||
sudo docker compose -f ${CONTAINER_DIR}/docker-compose.yml down
|
||||
cd $DOCKER_DIR
|
||||
$BACKUP_CMD
|
||||
sudo docker compose -f ${CONTAINER_DIR}/docker-compose.yml up -d
|
||||
|
||||
## Move BACKUP_FILENAME to BACKUP_FILE_PATH
|
||||
echo "rsync -avh --progress $BACKUP_FILENAME $SAVE_PATH"
|
||||
rsync -ah --progress $BACKUP_FILENAME $SAVE_PATH
|
||||
|
||||
## Delete local backup file
|
||||
echo "rm $BACKUP_FILENAME"
|
||||
rm -f $BACKUP_FILENAME
|
||||
|
||||
echo "$(date +'%F %R:%S'): Backup finished."
|
||||
@@ -1,35 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
DOCKER_DIR="/lvm1/docker"
|
||||
CONTAINER_NAME="nextcloud"
|
||||
CONTAINER_DIR="$DOCKER_DIR/$CONTAINER_NAME"
|
||||
SAVE_PATH="/media/backup/backup_docker/$CONTAINER_NAME/files"
|
||||
NOW_DATETIME="$(date +'%Y%m%d_%H%M%S')"
|
||||
BACKUP_FILENAME="backup_${CONTAINER_NAME}_$NOW_DATETIME.tar"
|
||||
BACKUP_FILE_PATH="$SAVE_PATH/$BACKUP_FILENAME"
|
||||
BACKUP_CMD="sudo tar cvf $BACKUP_FILENAME $CONTAINER_NAME"
|
||||
|
||||
echo "DOCKER_DIR: $DOCKER_DIR"
|
||||
echo "CONTAINER_DIR: $CONTAINER_DIR"
|
||||
echo "SAVE_PATH: $SAVE_PATH"
|
||||
echo "NOW_DATETIME: $NOW_DATETIME"
|
||||
echo "BACKUP_FILENAME: $BACKUP_FILENAME"
|
||||
echo "BACKUP_FILE_PATH: $BACKUP_FILE_PATH"
|
||||
echo "BACKUP_CMD: $BACKUP_CMD"
|
||||
echo "$(date +'%F %R:%S'): Backup start. BACKUP_CMD = $BACKUP_CMD"
|
||||
|
||||
mkdir -p $SAVE_PATH
|
||||
sudo docker compose -f ${CONTAINER_DIR}/docker-compose.yml down
|
||||
cd $DOCKER_DIR
|
||||
$BACKUP_CMD
|
||||
sudo docker compose -f ${CONTAINER_DIR}/docker-compose.yml up -d
|
||||
|
||||
## Move BACKUP_FILENAME to BACKUP_FILE_PATH
|
||||
echo "rsync -ah --progress $BACKUP_FILENAME $SAVE_PATH"
|
||||
rsync -ah --progress $BACKUP_FILENAME $SAVE_PATH
|
||||
|
||||
## Delete local backup file
|
||||
echo "rm $BACKUP_FILENAME"
|
||||
rm -f $BACKUP_FILENAME
|
||||
|
||||
echo "$(date +'%F %R:%S'): Backup finished."
|
||||
13
backup_pi.sh
13
backup_pi.sh
@@ -1,13 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
NOW_DATETIME="$(date +'%Y%m%d_%H%M%S')"
|
||||
SAVE_FOLDER="/media/upload/pi_backup"
|
||||
SAVE_FILENAME="pi4_$NOW_DATETIME.img"
|
||||
CMD="sudo /home/awin/bin/image-utils/image-backup -i $SAVE_FOLDER/$SAVE_FILENAME"
|
||||
LOG_FILE="/home/awin/log/backup_pi4.log"
|
||||
|
||||
mkdir -p $SAVE_FOLDER
|
||||
|
||||
echo "$(date +'%F %R:%S'): Backup start. CMD = $CMD" > $LOG_FILE
|
||||
$CMD
|
||||
echo "$(date +'%F %R:%S'): Backup finished." >> $LOG_FILE
|
||||
54
check_nas_dir.sh
Executable file
54
check_nas_dir.sh
Executable file
@@ -0,0 +1,54 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 定義幫助訊息函數
|
||||
usage() {
|
||||
echo "用法: sudo $0 <掛載路徑> <日誌檔案路徑>"
|
||||
echo "範例: sudo $0 /nas/Backup /var/log/nas_check.log"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# 檢查參數數量,如果少於 2 個則顯示 help
|
||||
if [ "$#" -ne 2 ]; then
|
||||
usage
|
||||
fi
|
||||
|
||||
MOUNT_PATH=$1
|
||||
LOG_FILE=$2
|
||||
|
||||
# 確保 log 檔案的目錄存在
|
||||
LOG_DIR=$(dirname "$LOG_FILE")
|
||||
if [ ! -d "$LOG_DIR" ]; then
|
||||
mkdir -p "$LOG_DIR"
|
||||
fi
|
||||
|
||||
# 取得目前時間
|
||||
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
|
||||
|
||||
# --- 核心檢查邏輯 ---
|
||||
|
||||
# 1. 檢查目錄是否為掛載點
|
||||
# 2. 檢查目錄是否可正常存取 (ls),避免 Stale File Handle 或連線僵死
|
||||
if mountpoint -q "$MOUNT_PATH" && ls "$MOUNT_PATH" > /dev/null 2>&1; then
|
||||
# 狀態正常
|
||||
exit 0
|
||||
else
|
||||
# 狀態異常,開始修復
|
||||
echo "[$TIMESTAMP] 偵測到 $MOUNT_PATH 掛載異常,準備修復..." >> "$LOG_FILE"
|
||||
|
||||
# 嘗試強制卸載 (Lazy unmount)
|
||||
# 使用 -l 可以即刻解除目錄占用,解決 "Device or resource busy"
|
||||
umount -l "$MOUNT_PATH" > /dev/null 2>&1
|
||||
|
||||
# 重新掛載 (讀取 /etc/fstab 設定)
|
||||
mount "$MOUNT_PATH" >> "$LOG_FILE" 2>&1
|
||||
|
||||
# 最終驗證
|
||||
if mountpoint -q "$MOUNT_PATH" && ls "$MOUNT_PATH" > /dev/null 2>&1; then
|
||||
echo "[$TIMESTAMP] $MOUNT_PATH 修復成功。" >> "$LOG_FILE"
|
||||
|
||||
# 這裡可以加入重啟 Docker 的通用邏輯 (選用)
|
||||
# systemctl restart docker
|
||||
else
|
||||
echo "[$TIMESTAMP] 錯誤: 無法掛載 $MOUNT_PATH,請檢查網路或 NAS 狀態。" >> "$LOG_FILE"
|
||||
fi
|
||||
fi
|
||||
152
newestN.sh
Executable file
152
newestN.sh
Executable file
@@ -0,0 +1,152 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 列出目錄內的所有檔案,只保留最新的n個檔案
|
||||
# 使用方法: newestN.sh -d=<目錄路徑> [-n=<保留數量>] [--confirm=<0|1>]
|
||||
|
||||
# 預設值
|
||||
DIR=""
|
||||
KEEP_NUM=2
|
||||
CONFIRM=0
|
||||
|
||||
# 顯示幫助訊息
|
||||
show_help() {
|
||||
echo "用法: $0 -d=<目錄路徑> [-n=<保留數量>] [--confirm=<0|1>]"
|
||||
echo ""
|
||||
echo "參數說明:"
|
||||
echo " -d=<目錄路徑> 指定要處理的目錄 (必需)"
|
||||
echo " -n=<保留數量> 保留最新的檔案數量 (預設: 2)"
|
||||
echo " --confirm=<0|1> 是否需要使用者確認 (預設: 0)"
|
||||
echo " 0 = 不須確認,直接刪除"
|
||||
echo " 1 = 需要使用者確認"
|
||||
echo ""
|
||||
echo "範例:"
|
||||
echo " $0 -d=/backup/logs -n=5"
|
||||
echo " $0 -d=/backup/logs -n=3 --confirm=1"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# 解析參數
|
||||
for arg in "$@"; do
|
||||
case $arg in
|
||||
-d=*)
|
||||
DIR="${arg#*=}"
|
||||
;;
|
||||
-n=*)
|
||||
KEEP_NUM="${arg#*=}"
|
||||
;;
|
||||
--confirm=*)
|
||||
CONFIRM="${arg#*=}"
|
||||
;;
|
||||
-h|--help)
|
||||
show_help
|
||||
;;
|
||||
*)
|
||||
echo "錯誤: 未知的參數 '$arg'"
|
||||
show_help
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# 檢查目錄參數是否提供
|
||||
if [ -z "$DIR" ]; then
|
||||
echo "錯誤: 必須提供目錄路徑"
|
||||
echo ""
|
||||
show_help
|
||||
fi
|
||||
|
||||
# 檢查目錄是否存在
|
||||
if [ ! -e "$DIR" ]; then
|
||||
echo "錯誤: 路徑 '$DIR' 不存在"
|
||||
echo ""
|
||||
show_help
|
||||
fi
|
||||
|
||||
# 檢查是否為目錄
|
||||
if [ ! -d "$DIR" ]; then
|
||||
echo "錯誤: '$DIR' 不是一個目錄"
|
||||
echo ""
|
||||
show_help
|
||||
fi
|
||||
|
||||
# 檢查保留數量是否為正整數
|
||||
if ! [[ "$KEEP_NUM" =~ ^[0-9]+$ ]] || [ "$KEEP_NUM" -lt 1 ]; then
|
||||
echo "錯誤: 保留數量必須是正整數"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 檢查 confirm 參數是否有效
|
||||
if [ "$CONFIRM" != "0" ] && [ "$CONFIRM" != "1" ]; then
|
||||
echo "錯誤: --confirm 參數必須是 0 或 1"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "處理目錄: $DIR"
|
||||
echo "保留最新 $KEEP_NUM 個檔案"
|
||||
echo ""
|
||||
|
||||
# 取得目錄中的所有檔案(不含子目錄),按修改時間排序(最新的在前)
|
||||
FILES=($(find "$DIR" -maxdepth 1 -type f -printf '%T@ %p\n' | sort -rn | cut -d' ' -f2-))
|
||||
|
||||
# 檔案總數
|
||||
TOTAL=${#FILES[@]}
|
||||
|
||||
if [ $TOTAL -eq 0 ]; then
|
||||
echo "目錄中沒有檔案"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "目錄中共有 $TOTAL 個檔案"
|
||||
echo ""
|
||||
|
||||
# 如果檔案數量小於或等於保留數量,不需要刪除
|
||||
if [ $TOTAL -le $KEEP_NUM ]; then
|
||||
echo "檔案數量 ($TOTAL) 未超過保留數量 ($KEEP_NUM),無需刪除"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# 計算要刪除的檔案數量
|
||||
DELETE_COUNT=$((TOTAL - KEEP_NUM))
|
||||
|
||||
echo "即將刪除 $DELETE_COUNT 個舊檔案:"
|
||||
echo "----------------------------------------"
|
||||
|
||||
# 列出即將被刪除的檔案
|
||||
TO_DELETE=("${FILES[@]:$KEEP_NUM}")
|
||||
for file in "${TO_DELETE[@]}"; do
|
||||
# 顯示檔案名稱和修改時間
|
||||
MOD_TIME=$(stat -c '%y' "$file" | cut -d'.' -f1)
|
||||
echo " $file (修改時間: $MOD_TIME)"
|
||||
done
|
||||
|
||||
echo "----------------------------------------"
|
||||
echo ""
|
||||
|
||||
# 如果需要確認
|
||||
if [ $CONFIRM -eq 1 ]; then
|
||||
read -p "確定要刪除以上檔案嗎? (y/N): " response
|
||||
case "$response" in
|
||||
[yY][eE][sS]|[yY])
|
||||
echo "開始刪除檔案..."
|
||||
;;
|
||||
*)
|
||||
echo "取消刪除操作"
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
else
|
||||
echo "開始刪除檔案..."
|
||||
fi
|
||||
|
||||
# 刪除舊檔案
|
||||
DELETED=0
|
||||
for file in "${TO_DELETE[@]}"; do
|
||||
if rm "$file" 2>/dev/null; then
|
||||
echo "已刪除: $file"
|
||||
DELETED=$((DELETED + 1))
|
||||
else
|
||||
echo "刪除失敗: $file"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "完成! 共刪除 $DELETED 個檔案"
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
echo "$(date +'%F %R:%S'): Sync /media/nasphoto/ /lvm1/docker/immich/nasphoto start."
|
||||
echo "$(date +'%F %R:%S'): Sync /nas/photo/ /DATA01/dockers/immich/nasphoto start."
|
||||
|
||||
rsync -avP --delete /media/nasphoto/ /lvm1/docker/immich/nasphoto
|
||||
rsync -avP --delete /nas/photo/ /DATA01/dockers/immich/nasphoto
|
||||
|
||||
echo "$(date +'%F %R:%S'): Sync /media/nasphoto/ /lvm1/docker/immich/nasphoto finished."
|
||||
echo "$(date +'%F %R:%S'): Sync /nas/photo/ /DATA01/dockers/immich/nasphoto finished."
|
||||
|
||||
Reference in New Issue
Block a user