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
相关产品推荐
相关产品推荐

