如何复制含绝对符号链接的文件夹并保留其相对目标路径
复制文件夹并将绝对符号链接转换为同目录相对链接
要实现把/usr/lib/x86_64-linux-gnu/wxcrafter文件夹复制到codeblocks路径下,同时将原有的绝对符号链接转为指向同目录目标文件的相对链接,这里有两种可靠的方法:
方法一:使用symlinks工具(推荐,简洁高效)
这个工具专门用于整理符号链接,能一键把绝对链接转为相对链接,步骤如下:
- 首先安装
symlinks(如果还没装的话):
sudo apt update && sudo apt install symlinks
- 完整复制源文件夹,保留所有符号链接(不跟随链接复制文件):
sudo cp -a /usr/lib/x86_64-linux-gnu/wxcrafter /usr/lib/x86_64-linux-gnu/codeblocks
这里的-a参数是归档模式,会保留权限、所有者、符号链接等所有属性,相当于-dR --preserve=all。
- 进入目标目录,转换所有绝对符号链接为相对链接:
cd /usr/lib/x86_64-linux-gnu/codeblocks sudo symlinks -cr .
-c:将绝对路径的符号链接转换为相对路径-r:递归处理子目录(如果你的文件夹有子目录的话)
执行完后,检查一下链接是否正确:
ls -l /usr/lib/x86_64-linux-gnu/codeblocks
你会看到lib1.so.0 -> ./lib1.so.0.0.0这样的相对链接,正是你需要的效果。
方法二:手动批量修改链接(无需额外安装工具)
如果不想安装新工具,可以用find结合shell脚本批量修改链接目标:
- 先复制文件夹(和方法一的步骤2一样):
sudo cp -a /usr/lib/x86_64-linux-gnu/wxcrafter /usr/lib/x86_64-linux-gnu/codeblocks
- 运行以下脚本,遍历并修改所有符合条件的符号链接:
sudo find /usr/lib/x86_64-linux-gnu/codeblocks -type l | while read -r link; do # 获取链接的原始目标 target=$(readlink "$link") # 检查目标是否指向原wxcrafter目录下的文件 if [[ "$target" == /usr/lib/x86_64-linux-gnu/wxcrafter/* ]]; then # 提取目标文件的文件名(去掉目录前缀) new_target=$(basename "$target") # 重新创建相对路径的符号链接 ln -sf "$new_target" "$link" fi done
这个脚本会自动识别所有指向原wxcrafter目录的绝对链接,将它们改为指向同目录下的对应文件,完全符合你的需求。
内容的提问来源于stack exchange,提问作者user3254720




