Tạo Script để khôi phục ảnh từ backup đã có trên Synology

Tú Cao
Tú Cao
Xuất bản: 12/08/2026 Cập nhật: 12/08/2026 | 0 Bình luận
Tóm tắt AI:
Đã sao chép prompt! Đang chuyển hướng...

Xin chào các bạn, quá trình mình làm Website và dọn dẹp tài nguyên mình gặp một vấn đề đó là ảnh bị thiếu khi chuyển hoặc do mình muốn chỉ giữ lại các hình ảnh đang sử dụng để tối ưu dung lượng.

Trước đó thì mình làm việc này tốt qua phần mềm nhỏ mà mình có làm là SEO Doctor Image Backup. Tuy nhiên quá trình của mình thì lại gặp 1 vấn đề là ảnh mình lưu trữ ở trên Server của Synology mà đặt tại công ty là khi tải dữ liệu từ máy chủ này về máy thì tốn thời gian ở công đoạn: Nến ảnh trên máy chủ, tải về máy tính, giải nén từ máy tính ra rồi scan. 

Chúng tốn quá nhiều thời gian, bởi vậy mình đã xem lại quy trình và tìm ra 1 cách tối ưu hơn là làm luôn trên Synology.

Cách làm thì cũng khá là đơn giản, chỉ cần 1 file scipt

#!/bin/bash

# ================= CẤU HÌNH =================

# 1. Thư mục chứa ảnh gốc (Thư mục kiểm tra)
SRC_DIR="/volume2/TuCao/tucaoblog/uploads"

# 2. Thư mục gốc lưu ảnh đích (Hệ thống sẽ tự thêm /uploads bên trong thư mục này)
DEST_DIR="/volume2/TuCao/recovered_images"

# 3. File danh sách lỗi
LIST_FILE="/volume2/file/404.txt"

# 4. Cấu hình Log
LOG_DIR="/volume2/TuCao/logs"
mkdir -p "$LOG_DIR" # Tự động tạo thư mục log nếu chưa có
LOG_FILE="$LOG_DIR/copy_images_$(date +%Y%m%d_%H%M%S).log"

# ================= HÀM GHI LOG =================
# Hàm này sẽ vừa in ra màn hình, vừa ghi vào file log
log() {
    local message="$1"
    echo -e "$message"
    echo -e "$(date '+%Y-%m-%d %H:%M:%S') - $message" >> "$LOG_FILE"
}

# ================= QUÁ TRÌNH XỬ LÝ =================

log "--- BẮT ĐẦU CHẠY SCRIPT ---"
log "Thư mục nguồn: $SRC_DIR"
log "Thư mục đích: $DEST_DIR/uploads"
log "File danh sách: $LIST_FILE"
log "File log: $LOG_FILE\n"

# Kiểm tra file danh sách
if [ ! -f "$LIST_FILE" ]; then
    log "[LỖI] Không tìm thấy file danh sách: $LIST_FILE"
    exit 1
fi

COUNT_SUCCESS=0
COUNT_FAIL=0

# Đọc từng dòng
while IFS= read -r url || [ -n "$url" ]; do
    # Xoá ký tự ngắt dòng \r (nếu file text tạo từ Windows) để tránh lỗi đường dẫn ảo
    url=$(echo "$url" | tr -d '\r')
    
    # Bỏ qua dòng trống
    [ -z "$url" ] && continue

    # Cắt bỏ phần "https://domain.com/uploads/"
    # Ví dụ: url = "https://images.nguyencaotu.com/uploads/2022/10/block.jpg.webp"
    # -> REL_PATH = "2022/10/block.jpg.webp"
    REL_PATH=$(echo "$url" | sed 's|^https*://[^/]*/uploads/||')

    # Đường dẫn file gốc cần kiểm tra
    FILE_SRC="$SRC_DIR/$REL_PATH"

    # Đường dẫn đích sẽ TỰ ĐỘNG THÊM 'uploads' vào cấu trúc
    # -> /volume2/TuCao/recovered_images/uploads/2022/10/block.jpg.webp
    FILE_DEST="$DEST_DIR/uploads/$REL_PATH"

    # Kiểm tra xem file có thực sự tồn tại trên NAS không
    if [ -f "$FILE_SRC" ]; then
        # Lấy đường dẫn thư mục đích
        DIR_DEST=$(dirname "$FILE_DEST")
        
        # Tạo cấu trúc thư mục đích nếu chưa có
        mkdir -p "$DIR_DEST"

        # Copy file
        if cp "$FILE_SRC" "$FILE_DEST"; then
            log "[THÀNH CÔNG] Đã copy: uploads/$REL_PATH"
            ((COUNT_SUCCESS++))
        else
            log "[LỖI COPY] Không thể copy: $FILE_SRC"
            ((COUNT_FAIL++))
        fi
    else
        log "[KHÔNG TỒN TẠI] uploads/$REL_PATH"
        ((COUNT_FAIL++))
    fi

done < "$LIST_FILE"

log "\n--- HOÀN THÀNH ---"
log "Tổng số ảnh copy THÀNH CÔNG: $COUNT_SUCCESS"
log "Tổng số ảnh THẤT BẠI / KHÔNG TỒN TẠI: $COUNT_FAIL"

Ghi chú:

  • /volume2/TuCao/tucaoblog/uploads : Thư mục đang lưu dữ liệu máy chủ Synology
  • /volume2/file/404.txt : Nơi chứa ảnh lỗi
  • /volume2/TuCao/logs : Nơi sẽ lưu log, log này sẽ thể hiện cho mình biết Hoàn thành hay chưa.
  • /volume2/TuCao/recovered_images : Đây là thư mục sẽ chứa ảnh mà nó tìm được.

Nếu bạn tham khảo script này thì bạn nhớ sửa lại các đường dẫn mà mình ghi chú nhé.

Hãy lưu script này vào 1 file .sh ví dụ: copy_missing_images.sh (mình lưu tại /volume2/TuCao/copy_mising_images.sh)

Tiếp theo dùng chế độ Task Scheduler của Synology để chạy Script này.

0978bbd1-b28c-43c2-b11a-ee7b4d55b985
Task Scheduler của Synology

Bạn cũng có thể chạy lệnh này qua Terminal như các script thông thường khác. Kết nối Putty từ máy local vào bộ Nas này rồi chạy lệnh là xong.

Đây là kết quả file Script trên mình chạy
Đây là kết quả file Script trên mình chạy

Thư mục uploads/2022 của mình nặng 20GB, riêng thời gian bung thử về máy tính mất tới 2h. Thế mà giờ chạy lại trên nas chỉ vài phút là mình đã xong ảnh. Giờ là đã có các ảnh mới, tải lên máy chủ là hoạt động thôi.

Mình viết bài này trước tiên là để mình nhớ cách làm này và hy vọng nếu có ai cùng gặp vấn đề có thể theo hướng này sẽ giúp bạn tiết kiệm thời gian.

Chúc bạn thành công!

0.0
0 Đánh giá

Bạn thấy bài viết này hữu ích?

Hãy chia sẻ để giúp bạn bè của bạn cũng chọn được sản phẩm phù hợp nhé!

Tú Cao

Tú Cao

CEO Sudo

Tú Cao (Nguyễn Cao Tú) là Founder & CEO Sudo, người làm Web, SEO và Digital Marketing từ 2013. Tú chia sẻ kinh nghiệm thực chiến về tăng trưởng, website, AI, Google Ads và vận hành sản phẩm số.

Bài Viết Liên Quan

Bình Luận

Địa chỉ email của bạn sẽ không được công khai. Các trường bắt buộc được đánh dấu *

Thông báo