generated from zj/archlinux-pkg
77 lines
3.5 KiB
Bash
77 lines
3.5 KiB
Bash
#!/bin/bash
|
|
|
|
# 定义你的修复脚本路径
|
|
FIX_SCRIPT="/home/smart/.tms3/starter/usb_disk_fix_script.sh"
|
|
LOG_FILE="/var/log/usb_disk_fix.log" # 这个日志文件路径和修复脚本中的一致
|
|
|
|
echo "----------------------------------------------------"
|
|
echo "$(date): Manual USB disk check started."
|
|
echo "----------------------------------------------------"
|
|
|
|
# 检查修复脚本是否存在
|
|
if [ ! -x "$FIX_SCRIPT" ]; then
|
|
echo "错误:修复脚本 '$FIX_SCRIPT' 不存在或没有执行权限。"
|
|
echo "请确保脚本已正确放置并设置了可执行权限。"
|
|
exit 1
|
|
fi
|
|
|
|
# 查找所有 USB 分区
|
|
USB_PARTITIONS_TO_CHECK=""
|
|
|
|
# 1. 首先,识别所有传输类型为 'usb' 的磁盘 (例如 /dev/sdc)
|
|
# -o NAME,TYPE,TRAN -p -n: 输出设备名、类型、传输协议,完整路径,不显示标题
|
|
# awk '$2 == "disk" && $3 == "usb" {print $1}': 过滤出类型为 'disk' 且传输协议为 'usb' 的设备名
|
|
USB_DISK_NAMES=$(lsblk -o NAME,TYPE,TRAN -p -n | awk '$2 == "disk" && $3 == "usb" {print $1}')
|
|
|
|
if [ -z "$USB_DISK_NAMES" ]; then
|
|
echo "$(date): 未发现任何 USB 磁盘。"
|
|
else
|
|
echo "$(date): 发现以下 USB 磁盘: $USB_DISK_NAMES"
|
|
for disk_name in $USB_DISK_NAMES; do
|
|
# 2. 对于每个 USB 磁盘,找到它下面的所有分区 (例如 /dev/sdc1)
|
|
# -o NAME,TYPE -p -n "$disk_name": 列出指定磁盘下的设备名和类型
|
|
# awk '$2 == "part" {gsub(/^[[:space:]]*[├└][─]*/, "", $1); print $1}': 过滤出类型为 'part' 的分区名
|
|
# 并使用 gsub() 函数去除 lsblk 输出中的前导字符 (如 '└─')
|
|
PARTITIONS_ON_DISK=$(lsblk -o NAME,TYPE -p -n "$disk_name" | awk '$2 == "part" {gsub(/^[[:space:]]*[├└][─]*/, "", $1); print $1}')
|
|
USB_PARTITIONS_TO_CHECK="$USB_PARTITIONS_TO_CHECK $PARTITIONS_ON_DISK"
|
|
done
|
|
fi
|
|
|
|
# 去除重复的设备路径,并确保路径是唯一的
|
|
USB_PARTITIONS_TO_CHECK=$(echo "$USB_PARTITIONS_TO_CHECK" | tr ' ' '\n' | sort -u | tr '\n' ' ')
|
|
|
|
if [ -z "$USB_PARTITIONS_TO_CHECK" ]; then
|
|
echo "$(date): 未发现任何 USB 分区需要检查。"
|
|
echo "----------------------------------------------------"
|
|
echo "$(date): Manual USB disk check finished."
|
|
echo "----------------------------------------------------"
|
|
exit 0
|
|
fi
|
|
|
|
echo "$(date): 发现以下 USB 分区,将逐一进行检查:"
|
|
echo "$USB_PARTITIONS_TO_CHECK"
|
|
echo ""
|
|
|
|
for dev_path in $USB_PARTITIONS_TO_CHECK; do
|
|
# 确保 dev_path 不为空或只包含空格
|
|
if [ -n "$dev_path" ]; then
|
|
echo "----------------------------------------------------"
|
|
echo "$(date): 正在检查分区: $dev_path"
|
|
echo "----------------------------------------------------"
|
|
# 调用你的修复脚本。现在修复脚本会直接将输出打印到终端。
|
|
# 确保当前脚本也以 sudo 运行,或者修复脚本已经配置为无密码 sudo。
|
|
# 最简单的方式是直接让用户以 sudo 运行此脚本。
|
|
"$FIX_SCRIPT" "$dev_path"
|
|
# 更新此消息,因为输出现在在终端可见
|
|
echo "$(date): 对 $dev_path 的检查已完成。详细信息请查看终端输出和日志文件: $LOG_FILE"
|
|
echo ""
|
|
fi
|
|
done
|
|
|
|
echo "----------------------------------------------------"
|
|
echo "$(date): 所有发现的 USB 分区检查已完成。"
|
|
echo "$(date): 详细的修复进度和结果已显示在终端,并记录在 '$LOG_FILE' 中。"
|
|
echo "----------------------------------------------------"
|
|
|
|
sleep 5 # 保持终端窗口打开,以便用户查看最终消息
|