问题场景描述
在Linux系统中,我们经常需要将USB设备与NTFS格式的分区进行数据同步。但NTFS分区默认不会自动挂载,这就导致直接运行rsync命令时会失败。本文分享一个实用的bash脚本解决方案。
关键技术点
实现这个功能需要解决两个核心问题:
- 准确检测NTFS分区是否已挂载
- 在未挂载时自动完成挂载操作
完整脚本实现
下面是一个经过优化的完整脚本,增加了错误处理和日志记录功能:
#!/bin/bash
# 配置部分
MOUNT_DRIVE="/dev/disk/by-id/scsi-SATA_Hitachi_HTS5416_SB3404GRGJRKBS-part5"
MOUNT_POINT="/media/Windows/"
LOG_FILE="/var/log/ntfs_sync.log"
SYNC_LOC="/media/Windows/vasia/Disertatie/"
SYNC_DEV="Disertatie"
# 创建日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}
# 检查挂载点是否存在
if [ ! -d "$MOUNT_POINT" ]; then
mkdir -p "$MOUNT_POINT" || {
log "创建挂载点目录失败: $MOUNT_POINT"
exit 1
}
fi
# 检测分区是否已挂载
if mount | grep -q "$MOUNT_POINT"; then
log "NTFS分区已挂载"
else
log "尝试挂载NTFS分区..."
if mount "$MOUNT_DRIVE" "$MOUNT_POINT"; then
log "挂载成功"
else
log "挂载失败"
exit 1
fi
fi
# 等待设备稳定
sleep 10
# 执行同步操作
log "开始同步数据..."
if rsync -axu "/media/DISK_IMG/${SYNC_DEV}/" "${SYNC_LOC}/"; then
log "同步完成"
# 可选:添加桌面通知
if which zenity >/dev/null; then
zenity --title "USB同步" --info --text "文件同步已完成" &
fi
else
log "同步过程中出现错误"
exit 1
fi
脚本优化建议
在实际使用中,还可以考虑以下改进:
- 添加UUID检测代替设备路径,避免设备名变化导致的问题
- 增加文件锁机制,防止脚本重复执行
- 添加邮件通知功能,便于远程监控
定时任务配置
如果需要定期执行同步,可以设置cron任务:
# 每天凌晨3点执行同步
0 3 * * * /path/to/ntfs_sync.sh
注意事项
使用该脚本前请确保:
- 已安装ntfs-3g驱动
- 当前用户有挂载权限
- 目标分区没有损坏