我有 2 个现有文件:abcd
和xyz
.
$ cat abcd
abcd
$ cat xyz
xyz
现在,当我尝试软链接这些文件时,我收到以下消息:
ln: cannot create xyz: File exists
我不想使用
ln -sf abcd xyz
xyz
命令,因为它将用的内容覆盖 的内容abcd
。
我想要的是:一旦取消链接,abcd
和都应该显示其原始内容。xyz
或者换句话说,我只是想暂时链接这两个文件。
请建议除了软/硬链接(例如使用安装等)之外是否还有其他解决方案。
编辑:我正在使用Solaris OS
它没有手动输入命令,如mount --bind
,,,,等mount -B
bindfs
fusermount
另外,我尝试使用 : mount -o bind abcd xyz
,它给出了以下消息 : cannot open /etc/vfstab
。我检查了一下,发现/etc/vfstab
只有Root
访问权限。
答案1
这不是我们ln
应该做的。 ln
创建现有文件的硬链接,即指向磁盘中同一文件的两个(或更多)目录条目。链接文件的工作方式是编辑一个文件会影响所有文件。
您想要的功能不是 Unix 原生的功能(链接文件以便它们显示为一个,以便以后可以取消链接)。 Linux不过,(几年前)已经实现了一种称为绑定安装的功能,允许将一个文件或目录安装在另一个文件或目录之上(文件在文件之上,目录在目录之上)。
建议的解决方案:如果您希望一个文件暂时“成为”另一个文件,请使用绑定挂载 ( mount -B file1 file2
)。这将安装file1
在file2
.稍后卸载后,这两个文件将再次显示为原来存在的样子。
# echo A >A
# echo B >B
# mount -B A B
# cat A
A
# cat B
A
# umount B
# cat A
A
# cat B
B
如果您希望“链接”文件显示为两者的串联,则必须创建第三个文件并稍后将其删除。
答案2
这个命令:
ln -sf abcd xyz
不会像您想象xyz
的那样用的内容覆盖 的内容abcd
。符号链接不是文件,因此它不包含任何内容。
如果您想暂时链接xyz
到abcd
而不丢失其内容,则需要以某种方式存储内容。
- 您可以将内容复制到临时文件中。我想这不需要任何说明。
- 您还可以使用内存,即将内容存储在变量中。
- 您可以使用硬链接。
现在我将演示最后一个。正如您的问题中所解释的,您有abcd
和xyz
。
硬链接
xyz
,zyx
使内容保留在zyx
让您操作的地方xyz
。$ ln xyz zyx
此时
xyz
和zyx
是两个硬链接索引节点包含 dataxyz
,如您的问题中所述。您可以通过以下方式检查:$ cat zyx xyz
现在
zyx
已经到位,您可以强制重新链接xyz
toabcd
。$ ln -sf abcd xyz
zyx
仍然保留人物xyz
。您可以通过以下方式检查:$ cat zyx xyz
While
xyz
现在软链接到abcd
.要检查,请运行以下命令:$ cat xyz abcd
一旦您想恢复起始状态,请重新链接
xyz
到原始内容。即重新链接到原来的inode。$ ln -f zyx xyz
要检查它是否有效:
$ cat xyz xyz
现在您可以使用以下命令取消附加硬链接
zyx
:$ rm zyx
或者保留它以供将来操作。无论哪种方式
xyz
仍然包含它在开始时所做的事情。$ rm zyx $ cat xyz xyz
答案3
abcd 和 xyz 取消链接后都应显示其原始内容
那么你想要的就不是链接了。如果两个文件链接,则它们具有相同的内容。更准确地说,如果两个目录条目指向同一文件,则它们是链接的。取消链接一个文件不会留下两个文件:取消链接一个目录项意味着删除这个目录项(删除文件的系统调用甚至称为unlink
)。
没有通用功能可以用另一个文件来隐藏一个文件。您可以使用绑定文件系统文件系统将目录与另一个目录进行影子映射。要将目录xyz
与目录进行影子映射abcd
,请运行
bindfs -n -o nonempty xyz abcd
此后, 的先前内容abcd
将被隐藏,并且abcd
以任何方式访问 都将访问xyz
。 Bindfs 是一个保险丝创建一个文件系统绑定挂载。要撤消阴影并查看 的原始内容abcd
,请卸载文件系统:
fusermount -u abcd
请注意,挂载文件系统不会更改磁盘上存储的内容。阴影仅限于您的计算机,并且最多只持续到下次重新启动为止。如果您希望阴影持续,您需要将此安装添加到启动时安装的列表中 ( /etc/fstab
)。但如果您希望阴影持续,那么安装可能不是正确的方法:只需移动文件并创建符号链接
mv abcd abcd.orig
ln -s xyz abcd
要返回,请删除符号链接并移回原始文件
rm abcd
mv abcd.orig abcd
答案4
据我了解,您想要链接两个文件,但不想丢失两个文件中的数据。您用 Solaris 标记了您的帖子,因此我假设您使用此操作系统。所以参考其他操作系统的功能似乎没什么用。此答案假设您正在使用一个或多个 zfs 数据集作为数据。
您可以简单地为文件系统创建一个 zfs 快照,在其中放置链接而不是文件,创建 ln -sf abcd xyz,用它做任何您想做的事情,然后回滚
root@solaris:/rpool# zfs create rpool/filesystem1
root@solaris:/rpool# mkfile 1k /rpool/filesystem1/file1
root@solaris:/rpool# mkfile 1k /rpool/filesystem1/file2
root@solaris:/rpool# ls -l /rpool/filesystem1
total 2
-rw------- 1 root root 1024 Jun 8 20:33 file1 .
-rw------- 1 root root 1024 Jun 8 20:33 file2
root@solaris:/rpool# zfs snapshot rpool/filesystem1@withtwofiles
root@solaris:/rpool# rm /rpool/filesystem1/file2
root@solaris:/rpool# ln -s /rpool/filesystem1/file1 /rpool/filesystem1/file1
root@solaris:/rpool# ls -l /rpool/filesystem1
total 4
-rw------- 1 root root 1024 Jun 8 20:33 file1
lrwxrwxrwx 1 root root 24 Jun 8 20:33 file2 -> /rpool/filesystem1/file1
root@solaris:/rpool# zfs rollback rpool/filesystem1@withtwofiles
root@solaris:/rpool# ls -l /rpool/filesystem1
total 6
-rw------- 1 root root 1024 Jun 8 20:33 file1
-rw------- 1 root root 1024 Jun 8 20:33 file2
root@solaris:/rpool#
您只需使用链接回滚文件系统,而不是取消链接