链接 2 个现有文件

Rai*_*ter 3 solaris hard-link mount symlink bind-mount

我有 2 个现有文件:abcdxyz.

$ cat abcd
abcd 
$ cat xyz
xyz
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试软链接这些文件时,我收到以下消息:

ln: cannot create xyz: File exists
Run Code Online (Sandbox Code Playgroud)

我不想使用

ln -sf abcd xyz
Run Code Online (Sandbox Code Playgroud)

命令,它将覆盖的内容xyz与的abcd

我要的是:既abcdxyz一旦解除连结应该显示自己的原创内容。

或者换句话说,我只想临时链接这两个文件。

请建议除了使用 mount 等软/硬链接之外是否还有其他解决方案。

编辑:我使用Solaris OS这对于喜欢命令没有手工录入mount --bindmount -Bbindfsfusermount,等

另外,我尝试使用 :mount -o bind abcd xyz并且它给出了以下 msg : cannot open /etc/vfstab。我检查并发现/etc/vfstab只能Root访问。

Mar*_*elo 17

这不是ln应该做的。 ln创建现有文件的硬链接,即两个(或更多)指向磁盘中同一个文件的目录条目。链接文件的工作方式是编辑一个文件会影响所有文件。

您想要的功能不是 Unix 原生的东西(链接文件,以便它们显示为一个,以便以后可以取消链接)。 不过,Linux(几年前)已经实现了一种称为绑定挂载的东西,允许将一个文件或目录挂载到另一个文件或目录之上(文件位于文件之上,目录位于目录之上)。

建议的解决方案:如果您希望文件暂时“成为”另一个文件,则使用绑定挂载 ( mount -B file1 file2)。这将安装file1file2. 稍后卸载后,这两个文件将再次显示为它们原来的存在。

# echo A >A

# echo B >B

# mount -B A B

# cat A
A

# cat B
A

# umount B

# cat A
A

# cat B
B
Run Code Online (Sandbox Code Playgroud)

如果您希望“链接”文件显示为两者的串联,则必须创建第三个文件并稍后将其删除。

  • 如果这允许普通用户“伪造”其他用户的文件内容,这可能会造成重大的安全问题。(我倾向于同意,如果用户拥有所有涉及的文件和目录,则应该允许这样做。不幸的是,事实并非如此)。 (3认同)
  • 允许普通用户执行此操作可能会通过大量绑定安装创建拒绝服务漏洞。我不知道典型的 Linux 内核如何处理数百万个挂载点。如果有人手头有 VM 快照,我很想知道。:-) (3认同)

小智 6

这个命令:

ln -sf abcd xyz
Run Code Online (Sandbox Code Playgroud)

不会覆盖的内容xyz与的abcd,因为你的想法。符号链接不是文件,因此它不包含任何内容。

如果您想在不丢失内容的情况下临时链接xyzabcd则需要以某种方式存储内容。

  • 您可以将内容复制到临时文件。我想不需要对此进行说明。
  • 您还可以使用内存,即将内容存储在变量中。
  • 您可以使用硬链接。

现在我将演示最后一个。您有abcdxyz,如您的问题中所述。

  1. 硬链接xyzzyx,以使内容物保持在zyx让你操纵xyz

    $ ln xyz zyx
    
    Run Code Online (Sandbox Code Playgroud)

    此时xyzzyx是包含 data的inode 的两个硬链接xyz,如您的问题所述。您可以通过以下方式检查:

    $ cat zyx
    xyz
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在zyx已经到位,您可以强制重新链接xyzabcd

    $ ln -sf abcd xyz
    
    Run Code Online (Sandbox Code Playgroud)

    zyx仍然保留字符xyz。您可以通过以下方式检查:

    $ cat zyx
    xyz
    
    Run Code Online (Sandbox Code Playgroud)

    虽然xyz现在软链接到abcd. 要检查运行这个:

    $ cat xyz
    abcd
    
    Run Code Online (Sandbox Code Playgroud)
  3. 一旦要恢复起始状态,请重新链接xyz到原始内容。也就是说,将其重新链接到原始 inode。

    $ ln -f zyx xyz
    
    Run Code Online (Sandbox Code Playgroud)

    要检查它是否有效:

    $ cat xyz
    xyz
    
    Run Code Online (Sandbox Code Playgroud)

    现在您可以取消附加硬链接的链接zyx

    $ rm zyx
    
    Run Code Online (Sandbox Code Playgroud)

    或者保留它以备将来操作。无论哪种方式,xyz仍然包含它在开始时所做的。

    $ rm zyx
    $ cat xyz
    xyz
    
    Run Code Online (Sandbox Code Playgroud)