PolyMC环境下含空格目录导致ln命令执行失败的问题求助
PolyMC存档关联脚本的空格兼容修复
问题根源
- 遍历逻辑缺陷:原脚本用
for i in instances/*遍历目录时,bash默认会按空格拆分文件名,带空格的目录(比如1.19 Sodium)会被拆成两个独立项,导致后续路径拼接直接出错。 - ln命令写法错误:原脚本里
ln -s saves '"'${i}/.minecraft/saves'"'的额外引号完全是画蛇添足,这些引号会被当作路径的一部分,系统自然找不到被截断的目标路径。
修复后的完整脚本
#!/bin/bash # 用find遍历instances下的所有一级子目录,完美兼容带空格的路径 find instances -maxdepth 1 -type d ! -name "instances" | while read -r instance_dir; do minecraft_dir="${instance_dir}/.minecraft" if [[ -d "${minecraft_dir}" ]]; then echo "正在处理: ${minecraft_dir}" saves_path="${minecraft_dir}/saves" # 清理旧的saves(软链接直接删,目录则递归删除) if [ -h "${saves_path}" ]; then rm -f "${saves_path}" else rm -rf "${saves_path}" fi # 创建软链接:用绝对路径做源,避免相对路径失效 ln -s "$(pwd)/saves" "${saves_path}" fi done
关键改动说明
- 遍历方式替换:改用
find + while read -r组合,确保带空格的目录路径被完整读取,不会被拆分。-maxdepth 1限制只扫一级子目录,! -name "instances"排除目录本身。 - 全程双引号包裹变量:所有路径变量都用双引号套住,彻底避免空格导致的路径拆分问题。
- ln命令修正:软链接的源路径用
$(pwd)/saves生成绝对路径,确保不管脚本在哪执行都能关联正确的存档目录;目标路径直接用变量,不需要额外加引号。 - 可读性优化:把路径拆成独立变量,加了简单注释,后续改起来更方便。
注意事项
- 执行脚本前,确保你当前在PolyMC的根目录(也就是
saves和instances文件夹同级的位置),如果不是,把$(pwd)/saves改成saves的绝对路径就行。 - 保险起见,先备份原有存档再运行脚本,避免误删数据。
内容的提问来源于stack exchange,提问作者PranshuTheGamer
相关产品推荐
相关产品推荐

