#!/bin/bash
# ============================================================
# macOS EXFAT DIAGNOSTIKA + OPRAVA
# ============================================================
# Bezpečný nástroj pre externé exFAT disky.
#
# Funkcie:
# 1. Nájde volume "Expansion"
# 2. Zistí disk/partíciu
# 3. Zobrazí základnú diagnostiku
# 4. Odpojí volume
# 5. Spustí fsck_exfat -n (iba kontrola)
# 6. Ponúkne opravu fsck_exfat -y
# 7. Znovu pripojí volume
# 8. Urobí základnú kontrolu po oprave
# 9. Vytvorí log
#
# NIKDY:
# - neformátuje disk
# - nemaže súbory
# - nepoužíva dd
# - neprepíše iný disk
# ============================================================
set -u
VOLUME_NAME="Expansion"
LOG_DIR="$HOME/Desktop"
DATE="$(date '+%Y-%m-%d_%H-%M-%S')"
LOG_FILE="$LOG_DIR/exfat_diagnostika_$DATE.log"
# ------------------------------------------------------------
# Farby
# ------------------------------------------------------------
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'
# ------------------------------------------------------------
# Logovanie
# ------------------------------------------------------------
exec > >(tee -a "$LOG_FILE") 2>&1
echo
echo "============================================================"
echo " macOS EXFAT DIAGNOSTIKA A OPRAVA"
echo "============================================================"
echo
echo "Dátum: $(date)"
echo "Mac: $(scutil --get ComputerName 2>/dev/null || echo unknown)"
echo "macOS: $(sw_vers -productVersion)"
echo "Log: $LOG_FILE"
echo
# ------------------------------------------------------------
# Kontrola root
# ------------------------------------------------------------
if [ "$EUID" -ne 0 ]; then
echo -e "${YELLOW}Skript potrebuje administrátorské práva.${NC}"
echo "Spúšťam sudo..."
exec sudo "$0" "$@"
fi
# ------------------------------------------------------------
# Kontrola nástrojov
# ------------------------------------------------------------
for CMD in diskutil fsck_exfat ioreg system_profiler; do
if ! command -v "$CMD" >/dev/null 2>&1; then
echo -e "${RED}Chýba príkaz: $CMD${NC}"
exit 1
fi
done
# ------------------------------------------------------------
# Nájdeme volume
# ------------------------------------------------------------
echo
echo "------------------------------------------------------------"
echo "1. HĽADÁM VOLUME: $VOLUME_NAME"
echo "------------------------------------------------------------"
DISK_INFO="$(diskutil list)"
echo "$DISK_INFO"
DISK_IDENTIFIER="$(
diskutil info "$VOLUME_NAME" 2>/dev/null |
awk -F': ' '/Device Identifier/ {print $2; exit}'
)"
if [ -z "${DISK_IDENTIFIER:-}" ]; then
echo
echo -e "${RED}Volume '$VOLUME_NAME' sa nenašlo.${NC}"
echo
echo "Dostupné disky:"
diskutil list
exit 1
fi
DISK_NODE="/dev/$DISK_IDENTIFIER"
echo
echo -e "${GREEN}Nájdené:${NC} $DISK_NODE"
# ------------------------------------------------------------
# Základné informácie
# ------------------------------------------------------------
echo
echo "------------------------------------------------------------"
echo "2. INFORMÁCIE O VOLUME"
echo "------------------------------------------------------------"
diskutil info "$DISK_NODE"
# ------------------------------------------------------------
# Určenie parent disku
# ------------------------------------------------------------
PARENT_DISK="$(
diskutil info "$DISK_NODE" |
awk -F': ' '/Part of Whole/ {print $2; exit}'
)"
if [ -z "${PARENT_DISK:-}" ]; then
echo -e "${YELLOW}Nepodarilo sa určiť parent disk.${NC}"
else
echo
echo -e "${CYAN}Celý disk:${NC} /dev/$PARENT_DISK"
fi
# ------------------------------------------------------------
# USB diagnostika
# ------------------------------------------------------------
echo
echo "------------------------------------------------------------"
echo "3. USB DIAGNOSTIKA"
echo "------------------------------------------------------------"
ioreg -p IOUSB -l -w 0 |
grep -A 35 -B 5 "$VOLUME_NAME" || true
# ------------------------------------------------------------
# SMART
# ------------------------------------------------------------
echo
echo "------------------------------------------------------------"
echo "4. SMART / DISK INFO"
echo "------------------------------------------------------------"
if [ -n "${PARENT_DISK:-}" ]; then
diskutil info "/dev/$PARENT_DISK" |
grep -E \
"Device Identifier|Device / Media Name|Disk Size|Protocol|SMART Status|Read-Only|Solid State|Device Location" \
|| true
fi
echo
echo -e "${YELLOW}Poznámka:${NC}"
echo "USB externé Seagate disky často neposkytujú SMART informácie"
echo "cez USB bridge. 'SMART Status: Not Supported' preto samo"
echo "o sebe ešte neznamená poruchu."
# ------------------------------------------------------------
# Stav pripojenia
# ------------------------------------------------------------
echo
echo "------------------------------------------------------------"
echo "5. STAV PRIPOJENIA"
echo "------------------------------------------------------------"
diskutil info "$DISK_NODE" |
grep -E \
"Mounted|Mount Point|File System|Volume Name|Volume Total|Volume Free|Read-Only" \
|| true
# ------------------------------------------------------------
# Príprava na fsck
# ------------------------------------------------------------
echo
echo "============================================================"
echo "6. PRÍPRAVA NA KONTROLU EXFAT"
echo "============================================================"
echo
echo -e "${YELLOW}Volume bude teraz odmontované.${NC}"
echo "Žiadne súbory sa nevymažú."
read -r -p "Pokračovať? [a/N]: " ANSWER
if [[ ! "$ANSWER" =~ ^[AaYy]$ ]]; then
echo "Ukončené používateľom."
exit 0
fi
# ------------------------------------------------------------
# Unmount
# ------------------------------------------------------------
echo
echo "Odpájam volume..."
if ! diskutil unmount "$DISK_NODE"; then
echo
echo -e "${RED}Nepodarilo sa odmontovať volume.${NC}"
echo "Skontroluj, či ho nepoužíva Finder alebo nejaká aplikácia."
exit 1
fi
echo -e "${GREEN}Volume úspešne odmontované.${NC}"
# ------------------------------------------------------------
# RAW DEVICE
# ------------------------------------------------------------
RAW_DISK="/dev/r${DISK_IDENTIFIER}"
echo
echo "RAW zariadenie: $RAW_DISK"
# ------------------------------------------------------------
# FSCK - READ ONLY
# ------------------------------------------------------------
echo
echo "============================================================"
echo "7. EXFAT KONTROLA — BEZ ZÁPISU"
echo "============================================================"
echo
echo "Spúšťam:"
echo
echo " fsck_exfat -n $RAW_DISK"
echo
FSCK_CHECK=0
fsck_exfat -n "$RAW_DISK" || FSCK_CHECK=$?
echo
echo "Návratový kód kontroly: $FSCK_CHECK"
# ------------------------------------------------------------
# Výsledok
# ------------------------------------------------------------
echo
echo "============================================================"
echo "8. VYHODNOTENIE"
echo "============================================================"
if [ "$FSCK_CHECK" -eq 0 ]; then
echo -e "${GREEN}"
echo "Filesystem sa javí ako OK."
echo -e "${NC}"
REPAIR_NEEDED="NO"
else
echo -e "${YELLOW}"
echo "Filesystem hlási problém."
echo -e "${NC}"
REPAIR_NEEDED="YES"
fi
# ------------------------------------------------------------
# Oprava
# ------------------------------------------------------------
if [ "$REPAIR_NEEDED" = "YES" ]; then
echo
echo "------------------------------------------------------------"
echo "OPRAVA EXFAT"
echo "------------------------------------------------------------"
echo
echo -e "${YELLOW}Pozor:${NC}"
echo "fsck_exfat -y bude zapisovať zmeny do súborového systému."
echo
echo "Disk NEBUDE formátovaný."
echo "Používateľské súbory sa priamo nemažú."
echo
read -r -p "Naozaj spustiť opravu? [a/N]: " REPAIR
if [[ "$REPAIR" =~ ^[AaYy]$ ]]; then
echo
echo "Spúšťam opravu:"
echo
echo " fsck_exfat -y $RAW_DISK"
echo
fsck_exfat -y "$RAW_DISK"
REPAIR_CODE=$?
echo
echo "Návratový kód opravy: $REPAIR_CODE"
if [ "$REPAIR_CODE" -eq 0 ]; then
echo -e "${GREEN}Oprava bola dokončená.${NC}"
else
echo -e "${RED}Oprava skončila s chybovým kódom.${NC}"
fi
else
echo
echo "Oprava bola preskočená."
fi
else
echo
echo "Oprava nie je potrebná."
fi
# ------------------------------------------------------------
# Mount
# ------------------------------------------------------------
echo
echo "============================================================"
echo "9. OPÄTOVNÉ PRIPOJENIE"
echo "============================================================"
if diskutil mount "$DISK_NODE"; then
echo
echo -e "${GREEN}Volume bolo úspešne pripojené.${NC}"
else
echo
echo -e "${RED}Volume sa nepodarilo pripojiť.${NC}"
fi
# ------------------------------------------------------------
# Záverečná diagnostika
# ------------------------------------------------------------
echo
echo "============================================================"
echo "10. ZÁVEREČNÁ DIAGNOSTIKA"
echo "============================================================"
diskutil info "$DISK_NODE" |
grep -E \
"Device Identifier|Device / Media Name|Volume Name|Mounted|File System|Volume Total|Volume Free|Read-Only|SMART Status" \
|| true
# ------------------------------------------------------------
# Test čítania adresára
# ------------------------------------------------------------
echo
echo "------------------------------------------------------------"
echo "TEST ČÍTANIA"
echo "------------------------------------------------------------"
MOUNT_POINT="/Volumes/$VOLUME_NAME"
if [ -d "$MOUNT_POINT" ]; then
echo
echo "Prvé položky na disku:"
ls -lah "$MOUNT_POINT" | head -30
echo
echo -e "${GREEN}Finder volume je čitateľné.${NC}"
else
echo
echo -e "${RED}Mount point neexistuje.${NC}"
fi
# ------------------------------------------------------------
# Záver
# ------------------------------------------------------------
echo
echo "============================================================"
echo " HOTOVO"
echo "============================================================"
echo
echo "Log bol uložený do:"
echo
echo "$LOG_FILE"
echo
echo -e "${YELLOW}Dôležité:${NC}"
echo "Ak sa počas fsck objavili 'Input/output error',"
echo "filesystem môže byť opravený, ale disk môže mať"
echo "fyzické problémy alebo problémy s USB prenosom."
echo
echo "Ak disk znovu začne výrazne cvakať/škrkať,"
echo "zastav používanie disku a prioritou je záchrana dát."
echo
echo "============================================================"
Výsledok:
[lesnavevericka@Mac-mini-uzivatela-Lesna ~ % sudo fsck_exfat -y /dev/rdisk4s2
Password:
** Checking volume.
** Checking main boot region.
** Checking system files.
** Volume name is Expansion.
** Checking upper case translation table.
** Checking file system hierarchy.
** Checking active bitmap.
** Rechecking main boot region.
** Rechecking alternate boot region.
** The volume Expansion appears to be OK.
[lesnavevericka@Mac-mini-uzivatela-Lesna ~ % diskutil mount /dev/disk4s2
Volume Expansion on /dev/disk4s2 mounted

Comments “Zle sa mi odpojil exFAT 12TB disk so zálohami, tak sme ho opravili s GPT AI. Ak niekto zháň obdobný skript, už nehľadajte, tu je:”