硬链接会被破坏吗?

时间:2013-11-19 11:07:24

标签: git bash unix

我感觉我的硬链接不时会被打破。

我通过创建链接来同步几个副本,例如:

link ~/work/genDocs/bibs/SKM.bib SKM.bib

有一段时间我发现同步没有发生,我“更新”链接。就个人而言,我不认为,这应该发生,但可能是这样的链接被打破了吗?

我能想到的原因:

  • 系统更新
  • 干扰版本控制(我使用git)

2 个答案:

答案 0 :(得分:11)

如果重新创建原始文件(~/work/genDocs/bibs/SKM.bib)而不是就地修改,则会发生这种情况。将创建一个新的inode,但您的链接仍将指向旧的inode。您可以通过使用ln -s创建符号链接而不是使用link的硬链接来解决此问题。见What is the difference between a symbolic link and a hard link?

答案 1 :(得分:1)

为了避免在修改文件内容时更改inode,可以使用Unix文本文件编辑器ed

虽然(几乎)所有ed实现也使用临时文件(请参阅"In-place" editing of files),ed - 与sed -i不同(正如chepner已经指出的那样) - “就地”修改文件而不更改其各自的inode(请参阅Editing files with the ed text editor from scripts)。

# sed & ed example to demonstrate whether inode is being changed or preserved

# sed
# inode is changed
{
rm -Pfv testfile.txt
echo a > testfile.txt
ls -i testfile.txt
sed -i -e 's/a/A/' testfile.txt
ls -i testfile.txt
}

# ed
# inode is not changed
{
rm -Pfv testfile.txt
echo a > testfile.txt
ls -i testfile.txt
printf '%s\n' 'H' ',s/a/A/' 'wq' | ed -s testfile.txt
ls -i testfile.txt
}

# > 
# redirection operator preserves inode (on Mac OS X 10.6.8)
{
rm -Pfv testfile.txt
echo a > testfile.txt
ls -i testfile.txt
echo A > testfile.txt
ls -i testfile.txt
}