ป้ายกำกับ: Either

MacOs: Downloads จาก windows share folderMacOs: Downloads จาก windows share folder

เป็น script ที่ช่วยในการ Downloads จาก windows share folder หลาย ๆ ไฟล์ในโพลเดอร์และซับโพลเดอร์พร้อม ๆ กันในทีเดียว โดยจะข้ามไฟล์ที่ดาน์โหลดมาแล้ว จะข้ามไปให้เอง และรองรับทั้ง path windows ปกติ หรือ smb://


macos_downloads_smb.sh

#!/bin/bash

clear

# ==============================================================================
# USAGE INSTRUCTIONS & DOCUMENTATION
# ==============================================================================
# Purpose: Automatically mounts a remote SMB share and downloads specified 
#          directories to a local destination using rsync with deep auditing.
#
# How to use:
# 1. Update the CONFIGURATION section below with your desired paths and SMB server details.
# 2. In the 'paths' array, you can copy-paste either Windows or Mac paths.
#    ⚠️ IMPORTANT: If a path contains backslashes (\) or spaces, you MUST enclose 
#       it in SINGLE QUOTES ('...') to prevent Bash from misinterpreting them.
# 3. Make the script executable: chmod +x download_smb.sh
# 4. Run the script: ./download_smb.sh
# ==============================================================================

# ==========================================
# CONFIGURATION & INFORMATION SECTION
# ==========================================
# 1. Local destination directory on your Mac
DEST_BASE="/Users/common/Meetings"

# 2. SMB Server connection details
SMB_SERVER="windows.plusmagi.com"
SMB_BASE="commmon_technical"

# 3. List of target directories to download (Supports both Windows and Mac paths)
paths=(
	'importData',
    'event,
	'HolidayCalendar'
	'VDO Training\Day 1'
	'VDO Training\Day 2'
	"Front Office/"
)
# ==========================================

# --- AUTOMATED EXECUTION BEGINS HERE ---

# Counter variables for tracking folders
TOTAL_FOLDERS=${#paths[@]}
SUCCESS_COUNT=0
SKIP_COUNT=0
FAIL_COUNT=0

# Counter variables for tracking cumulative file metrics across all jobs
GRAND_TOTAL_FILES=0
GRAND_DOWNLOADED_FILES=0
GRAND_SKIPPED_FILES=0

# Ensure base directory exists locally
mkdir -p "$DEST_BASE"

# Trigger macOS to network mount the target volume 
echo "Connecting to the server..."
open "smb://${SMB_SERVER}/${SMB_BASE}"

echo "⏳ Please wait for the system to mount..."
MOUNT_POINT="/Volumes/${SMB_BASE}"
counter=0

# Keep polling until target volume is found in OS mounts (Timeout after 30s)
while [ ! -d "$MOUNT_POINT" ]; do
	sleep 2
	counter=$((counter+2))
	if [ $counter -gt 30 ]; then
		echo "❌ Error: Cannot detect the target volume."
		exit 1
	fi
done

# Normalization function to standardize slashed syntax profiles
convert_path() {
	local input_path="$1"
	# Replace all backslashes with standard unix slashes
	local clean_path=$(echo "$input_path" | tr '\\' '/')
	# Drop the server path dynamically if copied raw from Windows Explorer
	clean_path=$(echo "$clean_path" | sed -E "s|//${SMB_SERVER}/${SMB_BASE}/||I")
	clean_path=$(echo "$clean_path" | sed -E "s|^/||")
	echo "$clean_path"
}

# Start auditing and processing folders sequentially
for p in "${paths[@]}"; do
	CLEANED_PATH=$(convert_path "$p")
	SOURCE_DIR="$MOUNT_POINT/$CLEANED_PATH"
	FOLDER_NAME=$(basename "$CLEANED_PATH")
	TARGET_DIR="$DEST_BASE/$FOLDER_NAME"
	
	echo "----------------------------------------"
	echo "🔄 Auditing Folder: $FOLDER_NAME"
	echo "From: $SOURCE_DIR"
	echo "To:   $TARGET_DIR"
	
	# 1. Verify existence of target directory profile on server
	if [ ! -d "$SOURCE_DIR" ]; then
		echo "❌ Status: Failed (Source directory not found on SMB)"
		((FAIL_COUNT++))
		continue
	fi

	mkdir -p "$TARGET_DIR"

	# 2. Extract and layout the complete deep item payload tree structure
	echo "📂 Comprehensive Content Tree on SMB:"
	find "$SOURCE_DIR" ! -name ".DS_Store" -mindepth 1 2>/dev/null | sed "s|^$SOURCE_DIR/||" | sort | while read -r line; do
		# Dynamically map formatting markers via path directory nesting depth
		DEPTH=$(echo "$line" | tr -cd '/' | wc -c)
		PREFIX=""
		for ((i=0; i<DEPTH; i++)); do PREFIX="${PREFIX}  │"; done
		NAME=$(basename "$line")
		
		if [ -d "$SOURCE_DIR/$line" ]; then
			echo "$PREFIX  📁 $NAME/"
		else
			echo "$PREFIX  📄 $NAME"
		fi
	done

	# 3. Pre-count total files on SMB (excluding .DS_Store and directories)
	TOTAL_SMB_FILES=$(find "$SOURCE_DIR" -type f ! -name ".DS_Store" 2>/dev/null | wc -l | xargs)

	# 4. Trigger raw processing sync and preserve modifications attributes
	RSYNC_OUTPUT=$(rsync -rltvP --stats --exclude='.DS_Store' "$SOURCE_DIR/" "$TARGET_DIR/" 2>&1)
	RSYNC_STATUS=$?

	# 5. Safely extract network logs statistics
	FILES_TRANSFERRED=$(echo "$RSYNC_OUTPUT" | grep "Number of regular files transferred:" | awk '{print $NF}')
	if [ -z "$FILES_TRANSFERRED" ]; then FILES_TRANSFERRED=0; fi

	SRC_TOTAL_SIZE=$(echo "$RSYNC_OUTPUT" | grep "Total file size:" | awk '{print $4}')
	TARGET_TOTAL_FILES=$(find "$TARGET_DIR" -type f ! -name ".DS_Store" | wc -l | xargs)

	# Calculate skipped files strictly based on total files vs transferred files
	SKIPPED_FILES=$((TOTAL_SMB_FILES - FILES_TRANSFERRED))
	if [ $SKIPPED_FILES -lt 0 ]; then SKIPPED_FILES=0; fi

	# Accumulate grand total metrics across all items for the final audit report
	GRAND_TOTAL_FILES=$((GRAND_TOTAL_FILES + TOTAL_SMB_FILES))
	GRAND_DOWNLOADED_FILES=$((GRAND_DOWNLOADED_FILES + FILES_TRANSFERRED))
	GRAND_SKIPPED_FILES=$((GRAND_SKIPPED_FILES + SKIPPED_FILES))

	# 6. Strict Reporting Engine with Explicit File/Skip Counts
	if [ $RSYNC_STATUS -ne 0 ]; then
		echo "❌ Status: Failed (rsync exited with error code $RSYNC_STATUS)"
		((FAIL_COUNT++))
	elif [ "$FILES_TRANSFERRED" -gt 0 ]; then
		echo "🚀 Status: Synced & Verified (Total files: $TOTAL_SMB_FILES | Downloaded: $FILES_TRANSFERRED | Skipped: $SKIPPED_FILES)"
		echo "   [Integrity Check: Target now holds $TARGET_TOTAL_FILES files ($SRC_TOTAL_SIZE bytes)]"
		((SUCCESS_COUNT++))
	else
		if [ "$TARGET_TOTAL_FILES" -gt 0 ]; then
			echo "⏭️  Status: Skipped (Total files: $TOTAL_SMB_FILES | Downloaded: 0 | Skipped: $SKIPPED_FILES)"
			((SKIP_COUNT++))
		else
			echo "⚠️ Warning: Skipped but Target directory appears to be empty!"
			((SKIP_COUNT++))
		fi
	fi
done

# ==========================================
# 📊 FINAL EXHAUSTIVE SUMMARY REPORT
# ==========================================
echo "========================================"
echo "📊 EXHAUSTIVE DOWNLOAD SUMMARY REPORT"
echo "========================================"
echo "📁 Total Target Folders : $TOTAL_FOLDERS"
echo "✅ Successfully Synced  : $SUCCESS_COUNT Folders"
echo "⏭️  Skipped (Up to date) : $SKIP_COUNT Folders"
if [ $FAIL_COUNT -gt 0 ]; then
	echo "❌ Failed / Unverified  : $FAIL_COUNT Folders"
fi
echo "----------------------------------------"
echo "📈 CUMULATIVE FILE AUDIT METRICS:"
echo "📄 Grand Total Files    : $GRAND_TOTAL_FILES"
echo "📥 Total Files Synced   : $GRAND_DOWNLOADED_FILES"
echo "⏭️  Total Files Skipped  : $GRAND_SKIPPED_FILES"
echo "========================================"
if [ $FAIL_COUNT -eq 0 ]; then
	echo "✅ Audit Pass: All folders and deep payloads verified successfully!"
else
	echo "⚠️ Audit Attention Required: Some sync paths threw validation errors."
fi

อ่านเพิ่มเติม