通过脚本更新符号链接?

Tim*_*Tim 1 symlink

我有一个目录,其中包含许多指向其他目录的符号链接。现在我想通过符号链接重命名链接目录的公共祖先目录,并且还有指向相同目录的符号链接,但重命名的路径名除外。例如,符号链接指向/home/Tim/dir1, /home/Tim/dir2, ...,现在我希望符号链接指向/data/Tim/dir1, /data/Tim/dir2, ....

我想自动化更新符号链接的过程。但是有几个问题:

  1. 我听说不能编辑符号链接。那么我是否必须创建新的符号链接,然后覆盖现有的符号链接?

  2. 如何获取符号链接指向的目录的路径名,然后使用一些文本处理程序将路径名中祖先目录的旧名称替换为其新名称,并创建一个指向该目录的符号链接路径名?谢谢。

Ste*_*itt 5

我听说不能编辑符号链接。那么我是否必须创建新的符号链接,然后覆盖现有的符号链接?

符号链接无法编辑,这是正确的。您可以在单个操作中使用-fto 选项替换文件的符号链接ln,如果添加,-T您可以以相同的方式处理目录的符号链接:

ln -sfT /data/Tim/dir1 symlink1
Run Code Online (Sandbox Code Playgroud)

将创建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
Run Code Online (Sandbox Code Playgroud)

这将检索当前目录中的每个文件的路径(所以我假设在当前目录下需要固定所有的符号连接),并重新链接它,替换第一次出现homedata。Using&&确保仅在realpath成功时才替换符号链接(如果目标不存在则失败)。