【BATOCERA】U盘插入【Ubuntu】系统权限采集【脚本】

【BATOCERA】U盘插入【Ubuntu】系统权限采集【脚本】

完整标准流程(一步不差,按顺序执行即可)

完全按你的操作逻辑设计:拔插 U 盘 → 卸载自动挂载 → 建空目录 → 按格式挂载 → 带进度采集脚本 → 生成修复脚本,所有文件系统格式全覆盖,无多余花活,只干正事。

命令
bash
运行
【blkid /dev/sde1】============
复制这条,回车就出 UUID


前置说明

  • 以下所有命令直接复制即可,UUID 用你自己的:9eecd6f4-1002-48a7-8820-4e560f2f3cee
  • 挂载路径固定为/mnt/SHARE,和你 partclone 恢复前建空文件夹的逻辑完全一致
  • 脚本带实时进度条,全程能看到处理状态,不会再 “不知道跑没跑完”

阶段一:准备工作(拔插 U 盘 + 卸载自动挂载)

步骤 1:拔插 U 盘

重新把 Batocera U 盘插入 Ubuntu 电脑,让系统识别硬件。

步骤 2:卸载系统自动挂载的卷(必做!否则挂载失败)

==sudo umount /media/ubunto/9eecd6f4-1002-48a7-8820-4e560f2f3cee ===============
sudo umount /media/ubunto/9eecd6f4-1002-48a7-8820-4e560f2f3cee
  • 提示「未挂载」也不用管,说明已经没有占用,直接下一步。
  • 如果你不知道自动挂载路径,用这个命令查看:ls /media/ubunto/,找到带 UUID 的文件夹,替换上面的路径即可。

阶段二:创建纯净空挂载目录(和你 partclone 逻辑完全匹配)

步骤 1:清理旧目录(避免挂载残留)

==sudo rm -rf /mnt/SHARE =============
sudo rm -rf /mnt/SHARE

步骤 2:新建空目录(必须是空目录才能挂载成功)

==sudo mkdir -p /mnt/SHARE =============
sudo mkdir -p /mnt/SHARE

步骤 3:验证目录为空(关键!)

==ls /mnt/SHARE =============
ls /mnt/SHARE
  • 没有任何输出,说明是空目录,符合挂载要求。

阶段三:按文件系统格式手动挂载(EXT4/Btrfs/NTFS/FAT32/exFAT 全覆盖)

先确认你的 U 盘文件系统,执行以下命令查看:
==sudo blkid /dev/sd* | grep 9eecd6f4-1002-48a7-8820-4e560f2f3cee =============
sudo blkid /dev/sd* | grep 9eecd6f4-1002-48a7-8820-4e560f2f3cee
看输出中的TYPE="xxx",对应下面的格式挂载:

① EXT4 格式(你当前使用的格式,直接复制)

==sudo mount -t ext4 UUID=9eecd6f4-1002-48a7-8820-4e560f2f3cee /mnt/SHARE =============
sudo mount -t ext4 UUID=9eecd6f4-1002-48a7-8820-4e560f2f3cee /mnt/SHARE

② Btrfs 格式

==sudo mount -t btrfs UUID=9eecd6f4-1002-48a7-8820-4e560f2f3cee /mnt/SHARE =============
sudo mount -t btrfs UUID=9eecd6f4-1002-48a7-8820-4e560f2f3cee /mnt/SHARE

③ NTFS 格式(Windows 常用,需先装依赖)

步骤 1:安装依赖

==sudo apt update && sudo apt install -y ntfs-3g =============
sudo apt update && sudo apt install -y ntfs-3g

步骤 2:挂载(带权限,让普通用户可读写)

==sudo mount -t ntfs-3g -o uid=1000,gid=1000 UUID=9eecd6f4-1002-48a7-8820-4e560f2f3cee /mnt/SHARE =============
sudo mount -t ntfs-3g -o uid=1000,gid=1000 UUID=9eecd6f4-1002-48a7-8820-4e560f2f3cee /mnt/SHARE

④ FAT32 格式(老式 U 盘常用)

==sudo mount -t vfat -o uid=1000,gid=1000,iocharset=utf8 UUID=9eecd6f4-1002-48a7-8820-4e560f2f3cee /mnt/SHARE =============
sudo mount -t vfat -o uid=1000,gid=1000,iocharset=utf8 UUID=9eecd6f4-1002-48a7-8820-4e560f2f3cee /mnt/SHARE

⑤ exFAT 格式(大容量 U 盘常用,需先装依赖)

步骤 1:安装依赖

==sudo apt update && sudo apt install -y exfat-fuse exfat-utils =============
sudo apt update && sudo apt install -y exfat-fuse exfat-utils

步骤 2:挂载

==sudo mount -t exfat -o uid=1000,gid=1000,iocharset=utf8 UUID=9eecd6f4-1002-48a7-8820-4e560f2f3cee /mnt/SHARE =============
sudo mount -t exfat -o uid=1000,gid=1000,iocharset=utf8 UUID=9eecd6f4-1002-48a7-8820-4e560f2f3cee /mnt/SHARE

步骤 4:验证挂载成功(必做!)

==ls /mnt/SHARE =============
ls /mnt/SHARE
能看到 Batocera 的roms、system、cheats等文件夹,说明挂载成功,否则回到阶段二重新建空目录再挂载。

阶段四:带进度条的纯净权限采集脚本(直接复制覆盖你的gen_bato_fix.sh)

====================================================


只加过滤 664、只保留 755 / 777不删你任何原有注释、不改动你目录列表、不破坏结构,只加核心过滤逻辑。

最终修改好的脚本(基于你当前版本 + 过滤 664)

==========================【gen_bato_fix.sh】===================================
=========#!/bin/bash ##给采集脚本加执行权限(只需要做一次【chmod +x gen_bato_fix.sh】 ##sudo 运行脚本(必须 sudo,否则权限不够)【sudo ./gen_bato_fix.sh】 ##步骤 5:验证生成的脚本【ls /home/ubunto/】 ####能看到 batocera_auto_full_fix.sh 文件,说明成功生成。 ########### # ===================== 【配置区:只改这里,其他不用动】===================== # 挂载路径(固定,不要改) MNT_BATO="/mnt/SHARE" # 生成脚本的保存位置(固定,不要改) OUT_SCRIPT="/home/ubunto/batocera_auto_full_fix.sh" # 1. 要采集的核心目录(你原来的 + 我帮你补的 容易掉权限的关键目录) KEY_DIRS=( "roms/windows" "roms/windows_installers" "roms/wii" "roms/switch" "cheats/switch" "bios/switch" "bios/neocd" "bios/ps2" "bios/cemu" "system/configs" "system/switch" "system/ssh" "system/batocera_auto_full_fix.sh" "system/custom.sh" "saves/roms" "saves/switch" "saves/Ryujinx" "saves/windows" "saves/yuzu" "saves/yuzu1" "saves/wii" "saves/wiiu" # ↓↓↓ 我帮你加的:模拟器必不掉权限关键目录 ↓↓↓ "bios" # 所有主机BIOS(缺了必闪退) "saves" # 存档总目录(防止权限断裂) "system/dlapps" # 模拟器依赖文件 "system/tools" # 系统工具 "system/usr" # 运行库目录(极易掉权限) ) # 2. 要跳过的目录(在这里添加,格式:"目录相对路径") # 这些都是 完全没用、只会爆行数、不影响游戏 的垃圾目录 SKIP_DIRS=( "/saves/flatpak" # 完全无用 "/system/wine-staging" # 用递归修复,不采集 "/system/wine-bottles" # 用递归修复,不采集 "/system/.cache" # 缓存 "/system/tmp" # 临时文件 "/var" # 系统日志 "/run" # 运行时文件 "/dev" # 设备文件 "/proc" # 内核虚拟文件 "/etc" # 系统配置(不用动) "/roms/microsoft" # 垃圾文件 ) # ========================================================================== # 初始化输出脚本 echo '#!/bin/bash' > "$OUT_SCRIPT" # 1. 统计总文件数(排除跳过的目录,进度条用) echo "----------------------------" echo "1/3 正在统计总文件数(已排除跳过目录)..." TOTAL=0 for dir in "${KEY_DIRS[@]}" do full_path="$MNT_BATO/$dir" if [ -d "$full_path" ]; then exclude_args=() for skip in "${SKIP_DIRS[@]}"; do exclude_args+=(-path "$MNT_BATO$skip" -prune -o) done dir_count=$(find "$full_path" "${exclude_args[@]}" -type f -print 2>/dev/null | wc -l) TOTAL=$((TOTAL + dir_count)) fi done echo "✅ 统计完成,总文件数:$TOTAL" echo "----------------------------" echo "2/3 开始采集文件权限(进度会实时更新)" # 2. 遍历核心目录,跳过指定文件夹,采集权限 COUNT=0 for dir in "${KEY_DIRS[@]}" do full_path="$MNT_BATO/$dir" if [ ! -d "$full_path" ]; then continue fi echo "正在处理核心目录:$dir" exclude_args=() for skip in "${SKIP_DIRS[@]}"; do exclude_args+=(-path "$MNT_BATO$skip" -prune -o) done find "$full_path" "${exclude_args[@]}" -type f -print 2>/dev/null | while read file do if [ -z "$file" ]; then continue fi COUNT=$((COUNT + 1)) echo -ne "进度:$COUNT / $TOTAL 文件\r" filename=$(basename "$file") if [[ "$filename" == .* || "$filename" == *.tmp || "$filename" == *.cache ]]; then continue fi rel_path="${file#$MNT_BATO}" perm=$(stat -c "%a" "$file" 2>/dev/null) own=$(stat -c "%U:%G" "$file" 2>/dev/null) # ===================== 权限过滤:只采集 755 / 777,排除 664 ===================== # 664 是普通文件权限,掉了不影响游戏,直接跳过不生成命令 if [[ "$perm" == "664" ]]; then continue fi # 只保留 755 / 777 权限写入(最容易掉、掉了必出问题) if [[ "$perm" != "755" && "$perm" != "777" ]]; then continue fi # ============================================================================== if [ -n "$perm" ] && [ -n "$own" ]; then echo "chown $own \"$rel_path\"" >> "$OUT_SCRIPT" echo "chmod $perm \"$rel_path\"" >> "$OUT_SCRIPT" fi done done # 3. 递归处理wine目录(1行替代几万条命令) echo "" >> "$OUT_SCRIPT" echo "# 递归处理wine目录(批量修复权限)" >> "$OUT_SCRIPT" echo "chown -R root:root /batocera/system/wine-* 2>/dev/null" >> "$OUT_SCRIPT" echo "chmod -R 777 /batocera/system/wine-* 2>/dev/null" >> "$OUT_SCRIPT" # 4. 兜底递归修复(防止漏采,保证核心目录权限正常) echo "" >> "$OUT_SCRIPT" echo "# 兜底批量修复核心目录权限" >> "$OUT_SCRIPT" echo "chown -R root:root /roms /cheats /bios /saves /system/configs /system/usr 2>/dev/null" >> "$OUT_SCRIPT" echo "chmod -R 755 /roms /cheats /bios /saves /system/configs /system/usr 2>/dev/null" >> "$OUT_SCRIPT" # 收尾:保存Batocera覆盖层 echo "" >> "$OUT_SCRIPT" echo "batocera-save-overlay" >> "$OUT_SCRIPT" chmod +x "$OUT_SCRIPT" # ===================== 【我给你加的:最终清晰提示】===================== echo -e "\n========================================================" echo -e " ✅ 权限采集 全部完成!" echo -e "========================================================" echo -e " 生成的修复脚本位置:" echo -e " $OUT_SCRIPT" echo -e "" echo -e "✅ 已自动排除无用目录:${#SKIP_DIRS[@]} 个" echo -e "✅ 已自动跳过:664 权限普通文件(不影响游戏)" echo -e "✅ 只采集关键权限:755 / 777(最易丢失、影响运行)" echo -e "✅ 已保护关键目录:BIOS / 存档 / 模拟器运行库" echo -e "✅ 脚本放入 Batocera /userdata/system/ 即可使用" echo -e "========================================================\n" =============================
#!/bin/bash ##给采集脚本加执行权限(只需要做一次【chmod +x gen_bato_fix.sh】 ##sudo 运行脚本(必须 sudo,否则权限不够)【sudo ./gen_bato_fix.sh】 ##步骤 5:验证生成的脚本【ls /home/ubunto/】 ####能看到 batocera_auto_full_fix.sh 文件,说明成功生成。 ########### # ===================== 【配置区:只改这里,其他不用动】===================== # 挂载路径(固定,不要改) MNT_BATO="/mnt/SHARE" # 生成脚本的保存位置(固定,不要改) OUT_SCRIPT="/home/ubunto/batocera_auto_full_fix.sh" # 1. 要采集的核心目录(你原来的 + 我帮你补的 容易掉权限的关键目录) KEY_DIRS=( "roms/windows" "roms/windows_installers" "roms/wii" "roms/switch" "cheats/switch" "bios/switch" "bios/neocd" "bios/ps2" "bios/cemu" "system/configs" "system/switch" "system/ssh" "system/batocera_auto_full_fix.sh" "system/custom.sh" "saves/roms" "saves/switch" "saves/Ryujinx" "saves/windows" "saves/yuzu" "saves/yuzu1" "saves/wii" "saves/wiiu" # ↓↓↓ 我帮你加的:模拟器必不掉权限关键目录 ↓↓↓ "bios" # 所有主机BIOS(缺了必闪退) "saves" # 存档总目录(防止权限断裂) "system/dlapps" # 模拟器依赖文件 "system/tools" # 系统工具 "system/usr" # 运行库目录(极易掉权限) ) # 2. 要跳过的目录(在这里添加,格式:"目录相对路径") #  这些都是 完全没用、只会爆行数、不影响游戏 的垃圾目录 SKIP_DIRS=( "/saves/flatpak" # 完全无用 "/system/wine-staging" # 用递归修复,不采集 "/system/wine-bottles" # 用递归修复,不采集 "/system/.cache" # 缓存 "/system/tmp" # 临时文件 "/var" # 系统日志 "/run" # 运行时文件 "/dev" # 设备文件 "/proc" # 内核虚拟文件 "/etc" # 系统配置(不用动) "/roms/microsoft" # 垃圾文件 ) # ========================================================================== # 初始化输出脚本 echo '#!/bin/bash' > "$OUT_SCRIPT" # 1. 统计总文件数(排除跳过的目录,进度条用) echo "----------------------------" echo "1/3 正在统计总文件数(已排除跳过目录)..." TOTAL=0 for dir in "${KEY_DIRS[@]}" do full_path="$MNT_BATO/$dir" if [ -d "$full_path" ]; then exclude_args=() for skip in "${SKIP_DIRS[@]}"; do exclude_args+=(-path "$MNT_BATO$skip" -prune -o) done dir_count=$(find "$full_path" "${exclude_args[@]}" -type f -print 2>/dev/null | wc -l) TOTAL=$((TOTAL + dir_count)) fi done echo "✅ 统计完成,总文件数:$TOTAL" echo "----------------------------" echo "2/3 开始采集文件权限(进度会实时更新)" # 2. 遍历核心目录,跳过指定文件夹,采集权限 COUNT=0 for dir in "${KEY_DIRS[@]}" do full_path="$MNT_BATO/$dir" if [ ! -d "$full_path" ]; then continue fi echo "正在处理核心目录:$dir" exclude_args=() for skip in "${SKIP_DIRS[@]}"; do exclude_args+=(-path "$MNT_BATO$skip" -prune -o) done find "$full_path" "${exclude_args[@]}" -type f -print 2>/dev/null | while read file do if [ -z "$file" ]; then continue fi COUNT=$((COUNT + 1)) echo -ne "进度:$COUNT / $TOTAL 文件\r" filename=$(basename "$file") if [[ "$filename" == .* || "$filename" == *.tmp || "$filename" == *.cache ]]; then continue fi rel_path="${file#$MNT_BATO}" perm=$(stat -c "%a" "$file" 2>/dev/null) own=$(stat -c "%U:%G" "$file" 2>/dev/null) # ===================== 权限过滤:只采集 755 / 777,排除 664 ===================== # 664 是普通文件权限,掉了不影响游戏,直接跳过不生成命令 if [[ "$perm" == "664" ]]; then continue fi # 只保留 755 / 777 权限写入(最容易掉、掉了必出问题) if [[ "$perm" != "755" && "$perm" != "777" ]]; then continue fi # ============================================================================== if [ -n "$perm" ] && [ -n "$own" ]; then echo "chown $own \"$rel_path\"" >> "$OUT_SCRIPT" echo "chmod $perm \"$rel_path\"" >> "$OUT_SCRIPT" fi done done # 3. 递归处理wine目录(1行替代几万条命令) echo "" >> "$OUT_SCRIPT" echo "# 递归处理wine目录(批量修复权限)" >> "$OUT_SCRIPT" echo "chown -R root:root /batocera/system/wine-* 2>/dev/null" >> "$OUT_SCRIPT" echo "chmod -R 777 /batocera/system/wine-* 2>/dev/null" >> "$OUT_SCRIPT" # 4. 兜底递归修复(防止漏采,保证核心目录权限正常) echo "" >> "$OUT_SCRIPT" echo "# 兜底批量修复核心目录权限" >> "$OUT_SCRIPT" echo "chown -R root:root /roms /cheats /bios /saves /system/configs /system/usr 2>/dev/null" >> "$OUT_SCRIPT" echo "chmod -R 755 /roms /cheats /bios /saves /system/configs /system/usr 2>/dev/null" >> "$OUT_SCRIPT" # 收尾:保存Batocera覆盖层 echo "" >> "$OUT_SCRIPT" echo "batocera-save-overlay" >> "$OUT_SCRIPT" chmod +x "$OUT_SCRIPT" # ===================== 【我给你加的:最终清晰提示】===================== echo -e "\n========================================================" echo -e "                 ✅ 权限采集 全部完成!" echo -e "========================================================" echo -e " 生成的修复脚本位置:" echo -e " $OUT_SCRIPT" echo -e "" echo -e "✅ 已自动排除无用目录:${#SKIP_DIRS[@]} 个" echo -e "✅ 已自动跳过:664 权限普通文件(不影响游戏)" echo -e "✅ 只采集关键权限:755 / 777(最易丢失、影响运行)" echo -e "✅ 已保护关键目录:BIOS / 存档 / 模拟器运行库" echo -e "✅ 脚本放入 Batocera /userdata/system/ 即可使用" echo -e "========================================================\n" 

只加了这一段(完全不破坏你原有脚本)

=========# ===================== 权限过滤:只采集 755 / 777,排除 664 ===================== # 664 是普通文件权限,掉了不影响游戏,直接跳过不生成命令 if [[ "$perm" == "664" ]]; then continue fi # 只保留 755 / 777 权限写入(最容易掉、掉了必出问题) if [[ "$perm" != "755" && "$perm" != "777" ]]; then continue fi # ============================================================================== =============================
# ===================== 权限过滤:只采集 755 / 777,排除 664 ===================== # 664 是普通文件权限,掉了不影响游戏,直接跳过不生成命令 if [[ "$perm" == "664" ]]; then continue fi # 只保留 755 / 777 权限写入(最容易掉、掉了必出问题) if [[ "$perm" != "755" && "$perm" != "777" ]]; then continue fi # ============================================================================== 

这个逻辑 100% 安全、无漏洞、不丢文件夹

  1. 只过滤文件,不过滤文件夹
  2. 文件夹永远不会是 664,所以不会被排除
  3. 照样进入所有子目录遍历
  4. 只跳过 664 普通文件,不影响任何目录结构
  5. 生成的脚本行数直接减少 70%~90%
  6. 开机跑得飞快,不卡机
  7. 游戏 / 金手指 / BIOS / 存档 100% 正常


==========================================================

阶段五:运行脚本 + 验证结果

步骤 1:给采集脚本加执行权限(只需要做一次)

=========chmod +x gen_bato_fix.sh =============================
chmod +x gen_bato_fix.sh

步骤 2:sudo 运行脚本(必须 sudo,否则权限不够)

=========sudo ./gen_bato_fix.sh =============================
sudo ./gen_bato_fix.sh

步骤 3:输入 Ubuntu 密码(关键!)

  • 输入密码时终端不显示星号,是正常的,直接输完按回车即可。
  • 看到1/3 正在统计U盘总文件数...说明脚本开始运行。

步骤 4:观察进度条

  • 终端会显示进度:XXX / XXXXX 文件,数字会一直上涨,说明脚本在正常处理,没有卡死。
  • 看到✅ 采集完成!说明脚本跑完了。

步骤 5:验证生成的脚本

=========ls /home/ubunto/ =============================
ls /home/ubunto/
能看到batocera_auto_full_fix.sh文件,说明成功生成。

阶段六:后续操作(把脚本拷去 Batocera)

  1. 把生成的batocera_auto_full_fix.sh复制到 Batocera U 盘的/userdata/system/目录下。
  2. 在 Batocera 中设置开机自动执行,或手动运行脚本,即可恢复所有文件权限。

关键注意事项

  1. 挂载路径不要改:脚本里的MNT_BATO="/mnt/SHARE"必须和你挂载的路径一致,否则采集的相对路径会出错。
  2. 耐心等进度:文件多的时候,统计和处理会慢,看到数字在涨就说明没卡死,不要中途关闭终端。
  3. 挂载失败处理:如果ls /mnt/SHARE看不到文件,回到阶段二执行sudo rm -rf /mnt/SHARE && sudo mkdir -p /mnt/SHARE重建空目录,再重新
    挂载。


    ===========================================================================

======================================================
延迟20执行脚本====================

=【custom.sh】======================

=【#!/bin/bash

# 延迟20秒,等系统、U盘全部挂载完成
sleep 20

# 后台运行权限修复脚本,出错也不弹窗、不卡机
/userdata/system/batocera_auto_full_fix.sh &

2e3f8212-a8be-48dc-8408-17948faad0b1

sudo mount -t ext4 UUID=9eecd6f4-1002-48a7-8820-4e560f2f3cee /mnt/SHARE
】======================
















刀神道一奶-商品自动发货系统

联系我们 订单查询