自动采集【权限脚本】最终版 gen_bato_fix.sh(已完美加入密钥权限)采集脚本

【权限脚本】最终版 gen_bato_fix.sh(已完美加入密钥权限)采集脚本


最终版 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" # 系统工具 "roms" # "system" # "system/switch" # "system/configs" # "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" # ===================== 【这里自动加入:万能密钥权限】===================== echo "" >> "$OUT_SCRIPT" echo "# 自动给所有模拟器 keys 目录+文件 赋777权限(通杀yuzu/ryujinx/任何模拟器)" >> "$OUT_SCRIPT" echo "find /system/configs -type d -name \"keys\" -exec chmod 777 {} \;" >> "$OUT_SCRIPT" echo "find /system/configs -path \"*/keys/*\" -type f -exec chmod 777 {} \;" >> "$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 "✅ 已自动加入:所有模拟器 keys 万能777权限" >> "$OUT_SCRIPT" 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" # 系统工具 "roms" #  "system" #  "system/switch" #  "system/configs" #  "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" # ===================== 【这里自动加入:万能密钥权限】===================== echo "" >> "$OUT_SCRIPT" echo "# 自动给所有模拟器 keys 目录+文件 赋777权限(通杀yuzu/ryujinx/任何模拟器)" >> "$OUT_SCRIPT" echo "find /system/configs -type d -name \"keys\" -exec chmod 777 {} \;" >> "$OUT_SCRIPT" echo "find /system/configs -path \"*/keys/*\" -type f -exec chmod 777 {} \;" >> "$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 "✅ 已自动加入:所有模拟器 keys 万能777权限" >> "$OUT_SCRIPT" echo -e "✅ 脚本放入 Batocera /userdata/system/ 即可使用" echo -e "========================================================\n" 

只加了这一段(完全不破坏你原来的任何东西)

===echo "" >> "$OUT_SCRIPT" echo "# 自动给所有模拟器 keys 目录+文件 赋777权限(通杀yuzu/ryujinx/任何模拟器)" >> "$OUT_SCRIPT" echo "find /system/configs -type d -name \"keys\" -exec chmod 777 {} \;" >> "$OUT_SCRIPT" echo "find /system/configs -path \"*/keys/*\" -type f -exec chmod 777 {} \;" >> "$OUT_SCRIPT" ====================
echo "" >> "$OUT_SCRIPT" echo "# 自动给所有模拟器 keys 目录+文件 赋777权限(通杀yuzu/ryujinx/任何模拟器)" >> "$OUT_SCRIPT" echo "find /system/configs -type d -name \"keys\" -exec chmod 777 {} \;" >> "$OUT_SCRIPT" echo "find /system/configs -path \"*/keys/*\" -type f -exec chmod 777 {} \;" >> "$OUT_SCRIPT" 

以后运行:

===sudo ./gen_bato_fix.sh ====================
sudo ./gen_bato_fix.sh
生成出来的脚本自动带:
  1. wine 权限
  2. 万能 keys 777(通杀所有模拟器)
  3. 全局兜底 755
  4. 保存权限

完美!

你现在这套 = Batocera + Btrfs 终极权限不死脚本





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

联系我们 订单查询