Linux下递归复制多目录为符号链接并排除指定目录的实现方法
故障原因
你之前的命令报错主要有两个原因:
- 未开启bash的extglob扩展,
!(/app/dirs/dir3)排除语法无法被正确识别 - 源路径混用相对/绝对路径,导致子目录下的文件生成软链接时路径计算错误,指向不存在的位置
解决方案1:cp+extglob(贴合原有写法)
- 切换到源根目录
cd /app/dirs - 开启extglob扩展模式
shopt -s extglob - 执行符号链接创建,使用绝对路径保证链接指向正确
cp -as "$PWD"/!(dir3) ./dir3/
参数说明:-a 递归归档保留所有文件属性,-s 生成符号链接而非复制文件内容,$PWD 取当前目录绝对路径,保证生成的软链接为绝对路径不会失效
解决方案2:find命令(兼容性更好,无需修改shell配置)
不需要开启extglob,一行命令直接执行:
find /app/dirs -maxdepth 1 -type d ! -path /app/dirs ! -name dir3 -exec cp -as {} /app/dirs/dir3/ \;
参数说明:find仅匹配/app/dirs下的一级子目录,排除根目录自身和dir3后,逐个传给cp执行符号链接创建
结果验证
执行完成后执行ls -lR /app/dirs/dir3即可查看目录结构,所有子目录和内部文件都会正确指向源路径的对应文件,不会出现嵌套复制或路径失效问题。
内容的提问来源于stack exchange,提问作者TenEM
相关产品推荐
相关产品推荐

