【发布时间】:2013-12-02 21:43:12
【问题描述】:
我感觉我的硬链接有时会被破坏。
我使用通过创建链接来同步几个副本,例如:
link ~/work/genDocs/bibs/SKM.bib SKM.bib
有一次我意识到没有进行同步,我“更新”了链接。我个人认为,这不应该发生,但可能是这样的链接被破坏了?
我能想到的原因:
- 系统更新
- 干扰版本控制(我使用 git)
【问题讨论】:
我感觉我的硬链接有时会被破坏。
我使用通过创建链接来同步几个副本,例如:
link ~/work/genDocs/bibs/SKM.bib SKM.bib
有一次我意识到没有进行同步,我“更新”了链接。我个人认为,这不应该发生,但可能是这样的链接被破坏了?
我能想到的原因:
【问题讨论】:
如果重新创建原始文件 (~/work/genDocs/bibs/SKM.bib) 而不是就地修改,则可能会发生这种情况。将创建一个新的 inode,但您的链接仍将指向旧的 inode。您可以通过使用ln -s 创建符号链接而不是使用link 的硬链接来解决此问题。见What is the difference between a symbolic link and a hard link?
【讨论】:
sed -i 创建一个新的修改文件,然后用它替换原来的文件。
为避免在修改文件内容时更改 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
}
【讨论】: