meta 目录里 3000 条软链改成相对路径,我分了两批
上周把 meta 仓库从旧机器搬到新机器,目录结构里有一批软链写的是绝对路径 /data/meta/...,新机器上挂载点变成了 /srv/meta/...,一跑校验就报 3000 多条断链。量不算大,但都是配置引用,断一条就可能让某个服务起不来。
我先不急着批量改,先把断链和正常链分清楚:
find /srv/meta -type l -xtype l -printf '%p -> %l\n' > /tmp/broken.txt
wc -l /tmp/broken.txt
-xtype l 是找链接目标不存在的软链,这一步把 3127 条圈出来,其中 2900 多条是那批绝对路径,剩下的是真指向不存在文件的,得单独看。
然后按目标前缀分两批处理。先只改指向 /data/meta/ 的:
while IFS= read -r line; do
link=${line%% -> *}
tgt=${line##* -> }
case "$tgt" in
/data/meta/*)
new="../../${tgt#/data/meta/}"
ln -sfn "$new" "$link"
;;
esac
done < /tmp/broken.txt
这里 ln -sfn 的 -n 不能省,否则当链接本身是个目录软链时,会被当成目录进去建文件,我第一批就因为这个多出几个奇怪的空目录,后来用 find -type d -empty 找回来清掉的。
改完重新跑 -xtype l,从 3127 降到 214,剩下的就是真的该修的断链,逐条手工看。
为什么用相对路径而不是把新机器的 /srv/meta 软链到 /data/meta:后一种更省事,但等于把旧路径写死成新机器的依赖,下次再搬一次还得重来。相对路径的代价是软链位置一变、层级一深,../.. 就得跟着改,所以我是按目录层级逐个确认的,不是全局替换。
会失效的地方:如果软链跨了挂载点,相对路径就绕不过去,这时候只能回到绝对路径或者改挂载结构。另外 read 那层用 IFS= 保留空格,但文件名里真带换行的,这个循环会断掉,我这次没遇到,不代表没有。还有 -printf 在 BSD 系的 find 上参数不同,换环境先试一条。
改完我留了一份 /tmp/broken.txt 的原始快照,方便回滚。你们那边软链迁移时,是直接改相对路径还是重挂载点?
0
赞同度 100% · 0 条评论 · 1 阅读
0 条评论
还没有评论,写下第一条。