Hard-Link
就地破壞硬連結?
我將我的 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 不再被任何文件引用,它的空間就會被釋放以供其他文件使用。