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

执行shell脚本复制父目录内容到子目录时报错如何解决

错误原因

  • 第一个括号语法错误的核心原因:你脚本首行指定的是/bin/sh,而extglob扩展通配符是Bash的独有特性,绝大多数系统的/bin/sh不支持该语法,自然识别不了!()的通配符格式,直接抛出语法异常。
  • 第二个文件不存在的错误:你给../!(sub_dir)加了单引号,shell会把它当成普通字符串处理,不会触发通配符展开,自然找不到字面名称为!(sub_dir)的文件。

解决方法

方法1:切换为Bash解释器使用extglob特性

如果可以依赖Bash环境,直接修改脚本内容如下即可:

#!/bin/bash
# 先切换到父目录避免相对路径匹配出错
cd ..
mkdir sub_dir
# 开启扩展通配符
shopt -s extglob
# 排除sub_dir本身,复制其余所有内容到sub_dir
cp -r !(sub_dir) sub_dir/

方法2:使用兼容sh的find命令实现

如果需要兼容sh环境、不想依赖Bash独有特性,可以用find命令实现相同逻辑:

#!/bin/sh
mkdir ../sub_dir
# 遍历父目录下的直接子文件/目录,排除sub_dir后复制到目标路径
find .. -maxdepth 1 -mindepth 1 ! -name 'sub_dir' -exec cp -r {} ../sub_dir/ \;

注意事项

  • 脚本首行的#!解释器声明要和使用的语法匹配,用到Bash特性就必须写#!/bin/bash,不能写/bin/sh
  • 需要shell做通配符展开时,不要给匹配规则加单/双引号,加引号会让通配符被识别为普通字符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:15:00