使用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
檔案內容。cat
cp
我們使用-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 因此改變)。