我有一个目录,其中包含许多指向其他目录的符号链接。现在我想通过符号链接重命名链接目录的共同祖先目录,并且还让符号链接指向相同的目录(除了重命名的路径名之外)。例如,符号链接指向/home/Tim/dir1
, /home/Tim/dir2
, ...,现在我希望符号链接指向/data/Tim/dir1
, /data/Tim/dir2
, ....
我想自动化更新符号链接的过程。但有几个问题:
我听说符号链接无法编辑。那么我是否必须创建新的符号链接,然后覆盖现有的符号链接?
如何获取符号链接指向的目录的路径名,然后使用一些文本处理程序将路径名中祖先目录的旧名称替换为新名称,并使用新名称创建指向该目录的符号链接路径名?谢谢。
答案1
我听说符号链接无法编辑。那么我是否必须创建新的符号链接,然后覆盖现有的符号链接?
符号链接无法编辑,这是正确的。您可以-f
使用选项在单个操作中替换文件的符号链接ln
,如果添加,-T
您可以以相同的方式处理目录的符号链接:
ln -sfT /data/Tim/dir1 symlink1
将创建symlink1
指向/data/Tim/dir1
,替换任何名为 的现有符号链接(或文件!)symlink1
。
如何获取符号链接指向的目录的路径名,然后使用一些文本处理程序将路径名中祖先目录的旧名称替换为新名称,并使用新名称创建指向该目录的符号链接路径名?
realpath
将为您提供符号链接指向的绝对路径。要处理您的符号链接:
for symlink in *; do
if [ -L "${symlink}" ]; then
origpath="$(realpath "${symlink}")" && ln -sfT "${origpath/home/data}" "${symlink}"
fi
done
这将检索当前目录中每个文件的路径(因此我假设当前目录中的所有符号链接都需要修复)并重新链接它,将第一次出现的 替换home
为data
.使用&&
可确保符号链接仅在realpath
成功时才被替换(如果目标不存在则失败)。