You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下执行Shell脚本遇报错:mkdir无法创建目录(文件已存在)

解决mkdir重复报错的问题

首先咱们来揪出问题根源:你看到的mkdir: cannot create directory ‘path1/output_perl’: File exists错误反复出现,本质是因为你的主脚本会遍历执行当前目录下所有.sh文件,而这些被调用的脚本里大概率都包含了mkdir path1/output_perl这条命令——第一次执行后目录已经存在,后续每次运行这条命令都会触发报错,错误信息被持续写入stderr.txt,自然就会反复出现。

给你两个直接可行的解决办法:

方法1:给mkdir加上-p参数(推荐)

mkdir的-p参数是个实用工具:它会自动创建所有不存在的父目录,要是目标目录已经存在,就会静默跳过不会报错。把所有涉及创建output_perl目录的mkdir命令改成下面这样:

mkdir -p "$OUTPUT_DIR/output_perl"

记得给变量加上双引号,避免路径里有空格或特殊字符时出现解析异常。

方法2:先检查目录是否存在再创建

如果不想用-p参数,也可以在创建前先判断目录是否存在,只有不存在时才执行创建操作:

if [ ! -d "$OUTPUT_DIR/output_perl" ]; then
    mkdir "$OUTPUT_DIR/output_perl"
fi

另外给你的脚本提两个优化小建议:

  • 别用ls *.sh遍历文件,直接写for FILE in *.sh就行,这样能避免文件名带空格或特殊字符时出现奇怪的问题。
  • 所有变量引用都加上双引号,比如"$FILE"、"$name",防止路径或文件名里的空格打乱命令执行逻辑。

修改后的完整脚本示例:

#!/bin/sh
# Create the structure of folders that will contain the result files
export perl_git_dir=path1
export OUTPUT_DIR=path2

# 创建主输出目录(用-p避免已存在时报错)
mkdir -p "$OUTPUT_DIR/output_perl"

# 为每个sh脚本创建对应的子目录
for FILE in *.sh
do
    echo "file is: $FILE"
    if [ -f "$FILE" ]; then
        name="${FILE%.*}"
        mkdir -p "$OUTPUT_DIR/output_perl/$name"
    fi
done

# 执行每个sh脚本并记录输出
for entry in *.sh
do
    if [ -f "$entry" ]; then
        echo "entry is $entry"
        echo "$entry" >> stdout.txt
        echo "$entry" >> stderr.txt
        ./"$entry" >> stdout.txt 2>> stderr.txt
    fi
done

内容的提问来源于stack exchange,提问作者rota90

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:09:12