取消連結硬連結檔案的最佳方法是什麼?

取消連結硬連結檔案的最佳方法是什麼?

使用rdfind我發現了很多硬連結檔案(~60-90),我想取消所有它們的連結。一種可能的解決方案是找到所有檔案-link +1 並複製它們,刪除它們並將其移回連結名稱。

有更好的解決方案嗎?有沒有更簡單的方法來做到這一點?

答案1

你可以做:

find . -type f -links +1 -exec sh -c '
  { rm -f "$1" && cat > "$1"; } < "$1"' sh {} \;

但這不會保留文件元資料。在 Linux 上,你可以這樣做:

find . -type f -links +1 -exec sh -c '
  { rm -f "$1" && cp -p /proc/self/fd/0 "$1"; } < "$1"' sh {} \;

請注意,如果cat或失敗(例如磁碟已滿),您將遺失/無法複製的cp檔案內容。catcp

我們使用-exec {} \;代替-exec {} +,以便在找到文件後更新文件的連結計數,以便find就不會尋找如果連結計數已降至 1,則為最後一個連結(這表示對於初始連結計數為 4 的文件,只有 3 個實例將被覆蓋)。

使用 GNU tar,您還可以執行以下操作:

find . -type f -links +1 -print0 |
  tar --hard-dereference --null -T - -cf - | tar xpf -

這將運行更少的命令,但覆蓋更多的檔案。

你可能會看到一些:

tar: ./file: file changed as we read it

對於大文件,但這沒關係,因為第二種方法tar會在覆蓋文件之前取消連結文件,因此實際上,這與第一種方法非常相似。當第二個 tar 取消連結檔案時,這只是第一次tar注意到連結計數減少(並且 ctime 因此改變)。

相關內容