Hard-Link

就地破壞硬連結?

  • August 10, 2021

我將我的 dotfiles 置於版本控制之下,部署它們的腳本會創建硬連結。我也習慣etckeeper將我的/etc置於版本控制之下。最近我收到這樣的警告:

warning: hard-linked files could cause problems with bzr

簡單的副本 ( cp filename.ext filename.ext) 將不起作用:

cp: `filename.ext' and `filename.ext' are the same file

重命名/移動文件(跨卷除外)也不會破壞硬連結。

所以我的問題是:有沒有辦法打破到文件的硬連結,而實際上不必知道該文件的其他硬連結在哪裡?

cp -p filename filename.tmp
mv -f filename.tmp filename

使其可編寫腳本:

dir=$(dirname -- "$filename")
tmp=$(TMPDIR=$dir mktemp)
cp -p -- "$filename" "$tmp"
mv -f -- "$tmp" "$filename"

首先進行複制,然後將其移動到位,其優點是文件從硬連結原子地更改為單獨的副本(沒有時間點filename部分或失去)。

您可能的意思是要將硬連結拆分為單獨的獨立文件。

mv hardlink tempname && cp tempname hardlink && rm tempname

硬連結是目錄中的條目與磁碟上的 inode 塊之間的連接。

inode 儲存文件元數據,對於小文件,一些文件系統將數據儲存在 inode 中,否則將指針儲存在數據塊中,對於非常大的文件,則使用指向磁碟分配單元的指針的間接和雙間接列表。

無論如何,文件名(這是 ls 命令產生的)和儲存此元數據的 inode 塊之間的連接稱為硬連結。

對單個文件具有多個硬連結意味著多個目錄條目引用了相同的 inode,可能位於不同的目錄中(在單個文件系統上)

rm 從目錄中刪除文件名條目。一旦一個 inode 不再被任何文件引用,它的空間就會被釋放以供其他文件使用。

引用自:https://unix.stackexchange.com/questions/66815