Dropbox同步硬链接吗?

我有一个包含大文件的文件夹。我希望这个文件夹同时存在于两个不同的位置 - 我的家庭文档和我的大学文档文件夹。
我已经通过在大学文件夹中创建一个指向家庭文件夹的符号链接来实现了这一点。
不幸的是,Dropbox会同步我的大学文件夹 - 我的文件空间很快就被用完了。
Dropbox是否支持硬链接,如果支持,我该如何创建一个?

这与Ubuntu有什么关系? - Nick Volynkin
2@NickVolynkin 我在Ubuntu上使用Dropbox,并且使用了Ubuntu的硬链接/符号链接。这有什么问题吗? - Tim
这是在Linux/Debian上使用Unix符号链接的Dropbox。对于任何Linux发行版,答案都是一样的。 - Nick Volynkin
@NickVolynkin 是吗?这些答案适用于Ubuntu吗?是的。所以这是合适的话题。我建议你在提出类似问题之前阅读[帮助/关于主题](它们是允许的)。 - Tim
嘿,冷静点。 - Nick Volynkin
你解决了吗?从文件夹创建一个硬链接没有意义(你只能硬链接i-node=文件)。 你打算只是从你的大学文件夹中链接你需要的个别文件,这样做行得通吗? - andrew lorien
1@andrewlorien 我发现当同步包含在内时,Dropbox存在内存泄漏问题,导致每小时内存使用量翻倍,最终导致电脑在早上崩溃。 - Tim
@andrewlorien:“文件夹的硬链接没有意义(你只能为i节点=文件创建硬链接)。” - 这是错误的...目录也是i节点。目录的硬链接(而不是"文件夹")“有意义”,但被禁止,因为它会在文件系统结构中创建循环,并意味着父目录不唯一。 - Jim Balter
2个回答

不,它不会。
当你更新一个文件时,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

所以我们可以说它会在共享文件夹中打破硬链接吗? - Falk
是的。硬链接会断开,而Dropbox内部的软链接只有在文件被更改后才会断开。 - andrew lorien
你证明了我错了,像这种情况下我该怎么办呢?我没有看到删除我的回答的选项,我应该编辑它吗?(提问者)能否更改已接受的答案呢? - Falk
我明天会运行这个脚本,我所在的地方现在是三点钟。 - Falk
好问题。在Stack Overflow积分方面,我只比你领先一点点,所以我不确定。@muru看起来是个专家... - andrew lorien
1@Falk 你不能删除已接受的答案。问题提出者可以随时接受另一个答案。你可以编辑你的回答,告诉用户参考这篇帖子而不是删除接受的答案。 - muru
@muru 有什么特别的话可以用吗?还是我只需要写“嘿,看看安德鲁的回答”就行了? - Falk
@Falk 有点像是“结果证明这个答案是错误的,请参考安德鲁的帖子(链接)获取正确答案”,也许。 - muru
谢谢大家。上周我刚获得了“一年级”徽章,所以这是一个很好的认可。 - andrew lorien
Dropbox在2019年中期改变了对符号链接的处理方式:https://help.dropbox.com/installs-integrations/sync-uploads/symlinks https://www.paulingraham.com/dropbox-and-symlinks.html - Jim Balter

事实证明这个答案是错误的,请参考安德鲁的帖子获取正确答案。

是的,我做到了。

我用一个标准的免费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命令的第一个数字显示i节点编号,权限和用户名之间的数字是链接计数器(显示文件具有多少个硬链接)。

在运行ln命令后,Dropbox托盘图标立即显示活动,并成功上传了测试文件。

我还测试了在Dropbox文件夹中创建第二个硬链接,它也上传了文件,但我不确定它是否意识到这只是一个文件。

我的测试文件是一个小的18KB的.ods文件,但它也可以处理更大的文件。

关于硬链接和i节点:

当你创建一个文件的硬链接时,你只是给它在不同文件夹中的第二个名称(如果你愿意,也可以是相同的名称)。

这些文件实际上并不真正放置在文件夹中,它们位于硬盘上,由一个i节点来标识(取决于文件系统类型)。

那么文件夹是什么?

文件夹只是一系列列表,也由一个i节点来标识,其中包含文件和其他“内部”文件夹的名称。此列表中的每个元素指向其对应的i节点。

因此,如果创建硬链接,所有链接都指向同一个i节点,因此它们都只是同一个文件。

注意,有些应用程序可能会拒绝处理具有硬链接的文件。其他应用程序可能会意外地或故意地打破硬链接,将一个文件分成两个文件,每个文件都有一个名称。
维基百科为我们提供了更多的信息:

https://en.wikipedia.org/wiki/Hard_link

https://en.wikipedia.org/wiki/Inode

要创建硬链接,您可以使用命令行工具ln。您可以像这样使用它:
ln TARGET LINK_NAME

目标是现有文件,link_name是文件的新名称。 完成后,您可以使用ls -li检查文件的i-node编号,并且会发现两个链接具有相同的编号。

这里是man页面:http://linux.die.net/man/1/ln


1我不认为这个回答解决了问题。问题是“Dropbox是否遵循硬链接”,而你根本没有提到Dropbox,只是离题地讲述了文件夹和inode是什么,提问者从未问过“什么是硬链接?”他们问的是关于Dropbox的。我是否在这个回答中漏掉了什么?因为现在看起来并没有回答问题。 - Mark Kirby
1问题在于硬链接在应用程序中看起来就像文件,因为它们本质上就是文件。因此,Dropbox或任何其他应用程序无法区分它是一个硬链接还是只有一个路径的文件。如果你理解硬链接,你就会明白Dropbox不会关心文件是如何进入其文件夹的。 - Falk
但有些东西不会遵循某些链接 - Dropbox 是否会遵循硬链接(并非所有应用都会,我需要具体了解)。 - Tim
确定吗?哪个应用程序不会“跟踪”硬链接? - Falk
OwnCloud,一个文件同步应用程序。 - Tim
好的,你说得对,OwnCloud不能处理带有多个链接的文件,但是Dropbox可以,我刚刚测试过了。我会修改我的回答。 - Falk
我在投票时支持了这个,但是后来改变了主意,可惜已经无法取消我的投票。请看下面的回答。 - andrew lorien
问题不在于Dropbox是否遵循硬链接(它怎么可能不遵循...那是一个内核函数),而在于它是否正确同步这些链接,这是完全不同的问题。 - Jim Balter