使用ln --symbolic时--force参数不生效,如何强制创建软链接?
问题原因
你使用的.*通配符默认会匹配两类内容:一类是你需要的正常隐藏文件(比如.gitignore、.env等),另一类是Linux系统下每个目录都自带的两个特殊目录:当前目录.、上层目录..。
第一次执行命令时目标目录不存在对应软链,不会触发冲突报错,但第二次执行时会遇到两个无法解决的冲突:
- 目标路径下的
.就是./websites/webtable/目录本身,--force参数也不支持将一个实体目录直接覆盖为软链接 - 源路径的
..和目标路径的..指向的是同一个上层目录,系统禁止为相同路径创建软链接
上述报错和--force参数是否生效无关,这两个特殊目录本身就属于系统禁止覆盖、禁止创建软链的对象。
解决办法
- 方法1:使用精准通配符排除特殊目录
用.[!.]*通配符匹配所有开头为.、第二位字符不为.的文件,刚好跳过.和..,修改后的命令如下:
ln --symbolic --relative --force ./websites/web1es/.[!.]* ./websites/webtable/
如果存在类似..test这种以两个点开头的特殊命名文件,可以额外补充..?*通配符组合使用:
ln --symbolic --relative --force ./websites/web1es/.[!.]* ./websites/web1es/..?* ./websites/webtable/
- 方法2:通过find命令筛选后创建链接
适合需要更灵活筛选规则的场景,以下命令只会匹配源目录下第一层的隐藏文件,自动跳过特殊目录:
find ./websites/web1es -maxdepth 1 -type f -name ".*" -exec ln --symbolic --relative --force {} ./websites/webtable/ \;
可根据需求调整-maxdepth(遍历层级)、-type(匹配文件/目录)参数。
- 方法3:利用bash的dotglob配置
开启dotglob后*通配符会自动包含隐藏文件,且默认排除.和..,执行完命令后再关闭配置即可:
shopt -s dotglob ln --symbolic --relative --force ./websites/web1es/* ./websites/webtable/ shopt -u dotglob
内容的提问来源于stack exchange,提问作者user14510150
相关产品推荐
相关产品推荐

