【问题标题】:Can hard links get broken?硬链接会被破坏吗?
【发布时间】:2013-12-02 21:43:12
【问题描述】:

我感觉我的硬链接有时会被破坏。

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

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

有一次我意识到没有进行同步,我“更新”了链接。我个人认为,这不应该发生,但可能是这样的链接被破坏了?

我能想到的原因:

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

【问题讨论】:

    标签: git bash unix


    【解决方案1】:

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

    【讨论】:

    • +1 例如,sed -i 创建一个新的修改文件,然后用它替换原来的文件。
    【解决方案2】:

    为避免在修改文件内容时更改 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-05
      • 2011-05-08
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 2019-02-23
      相关资源
      最近更新 更多