我有一个包含大量文件的文件夹。我希望该文件夹同时位于两个不同位置 - 我的“家庭”文档和我的“大学”文档文件夹。
我已经通过 College 文件夹中到 Home 文件夹的符号链接完成了此操作。
不幸的是,Dropbox 同步了我的大学文件夹 - 我的文件空间很快就用完了。
Dropbox 是否遵循硬链接,如果是,我该如何创建一个?
答案1
不,不是的。
当您更新文件时,Dropbox 会断开所有链接。因此,在 @Falk 上面给出的示例中,如果他从远程计算机编辑该文件,则当同步回来时,链接将断开,并且 Dropbox 将包含一个名为 的新文件testfile (Falks conflicted copy)
。
唯一有效的链接是软链接,其中原始文件是 dropbox 文件夹中的文件。这是我用来测试的脚本:
# symlink with target inside dropbox
echo "symbolic link test" > ~/Dropbox/symlinkToDropbox.txt
ln -s ~/Dropbox/symlinkToDropbox.txt ~/symlinkToDropbox.txt
cat ~/symlinkToDropbox.txt
echo "edit target of symlink" >> ~/Dropbox/symlinkToDropbox.txt
echo "edit symlink" >> ~/symlinkToDropbox.txt
cat ~/symlinkToDropbox.txt
cat ~/Dropbox/symlinkToDropbox.txt
# symlink with target outside dropbox
echo "symbolic link test" > ~/symlinkFromDropbox.txt
ln -s ~/symlinkFromDropbox.txt ~/Dropbox/symlinkFromDropbox.txt # relative symlinks don't work
cat ~/Dropbox/symlinkFromDropbox.txt
echo "edit target of symlink" >> ~/symlinkFromDropbox.txt
echo "edit symlink" >> ~/Dropbox/symlinkFromDropbox.txt
cat ~/symlinkFromDropbox.txt
cat ~/Dropbox/symlinkFromDropbox.txt
# hard link with target inside dropbox
echo "hard link test" > ~/Dropbox/hardlinkToDropbox.txt
ln ~/Dropbox/hardlinkToDropbox.txt ~/hardlinkToDropbox.txt
echo "edit target" >> ~/Dropbox/hardlinkToDropbox.txt
echo "edit linked file" >> ~/hardlinkToDropbox.txt
cat ~/hardlinkToDropbox.txt
cat ~/Dropbox/hardlinkToDropbox.txt
# hard link with target inside dropbox
echo "hard link test" > ~/hardlinkFromDropbox.txt
ln ~/hardlinkFromDropbox.txt ~/Dropbox/hardlinkFromDropbox.txt
echo "edit linked file" >> ~/Dropbox/hardlinkFromDropbox.txt
echo "edit target" >> ~/hardlinkFromDropbox.txt
cat ~/Dropbox/hardlinkFromDropbox.txt
cat ~/hardlinkFromDropbox.txt
#all of that works fine.
#But now open all of those files from your dropbox folder on another computer and edit them
#Your dropbox will sync, your local versions of all those files will be updated, but NONE OF THE LINKED FILES WILL UPDATE
#The hard links are replaced and the old versions copied as "conflicted copies"
#The symlink where the dropbox file was the link is unlinked
#the symlink where the dropbox file is the original is the only one that works
答案2
事实证明这个答案是错误的,请参阅 Andrew 的帖子以了解正确答案。
是的。
我已经使用标准免费 Dropbox 帐户对 btrfs 卷中的 Dropbox 文件夹进行了测试。
测试内容是:
ln /media/username/volume/Documents/testfile /media/username/volume/Dropbox/testfile
ls -li /media/username/volume/Documents/testfile
ls -li /media/username/volume/Dropbox/testfile
命令中的第一个数字ls -li
显示 inode 编号,权限和用户名之间的数字是链接计数器(显示文件有多少个硬链接)。
运行 ln 命令后,dropbox 尝试图标立即显示活动,并有效上传测试文件。
我还测试过在 Dropbox 文件夹内创建第二个硬链接,并且它也上传了文件,但我不确定它是否知道只有一个。
我的测试文件是一个 18KB 的小 .ods 文件,但它也应该可以处理更大的文件。
关于硬链接和 inode:
当您创建文件的硬链接时,您只是在另一个文件夹中为其赋予了第二个名称(如果愿意,也可以是相同的名称)。
这些文件实际上并非放置在文件夹中,而是放置在由 i 节点标识的硬盘上(取决于文件系统类型)。
那么文件夹是什么?
文件夹只是列表,也由 i 节点标识,其中包含文件和“其中”其他文件夹的名称。此列表中的每个元素都指向其对应的 i 节点。
因此,如果您创建硬链接,则它们都指向同一个 i 节点,因此它们都只是文件(同一个)。
请注意,有些应用程序拒绝处理具有硬链接的文件。其他应用程序可能会意外或故意破坏硬链接,从而将一个具有 2 个名称的文件变成两个各具有一个名称的文件。
维基百科为我们提供更多信息:
https://en.wikipedia.org/wiki/Hard_link
https://en.wikipedia.org/wiki/Inode
要创建硬链接,您可以使用ln
命令行工具,您可以像这样使用它:
ln TARGET LINK_NAME
其中 target 是现有文件,link_name 是文件的新名称。完成后,您可以检查ls -li
文件的 i-node 编号,并查看两个链接是否具有相同的编号。