Unix
斷開文件夾中的所有硬連結
我有一個文件夾,其中包含一定數量的文件,這些文件具有硬連結(在同一個文件夾或其他地方),我想取消這些文件的硬連結,因此它們變得獨立,並且對其內容的更改不會影響任何其他文件(它們的連結數變為 1)。
下面,我給出了一個解決方案,它基本上將每個硬連結複製到另一個位置,然後將其移回原位。
然而,這種方法似乎相當粗糙且容易出錯,所以我想知道是否有一些命令可以為我解除硬連結文件。
粗略的回答:
查找具有硬連結的文件(編輯:要查找具有硬連結的套接字等,請使用
find -not -type d -links +1
):find -type f -links +1 # files only find -not -type d -links +1 # files, sockets etc.
取消硬連結文件的粗略方法(將其複製到另一個位置,然後將其移回): 編輯: 正如 Celada 所說,最好在下面執行 cp -p ,以避免失去時間戳和權限。 編輯: 創建一個臨時目錄並複製到其下的文件,而不是覆蓋臨時文件,它最大限度地減少了覆蓋某些數據的風險,儘管該
mv
命令仍然存在風險(感謝@Tobu)。 編輯: 嘗試在同一文件系統(@MikkoRantalainen)中創建臨時目錄。# This is unhardlink.sh set -e for i in "$@"; do temp="$(mktemp -d -- "${i%/*}/hardlnk-XXXXXXXX")" [ -e "$temp" ] && cp -ip "$i" "$temp/tempcopy" && mv "$temp/tempcopy" "$i" && rmdir "$temp" done
因此,要取消所有硬連結的硬連結(編輯:更改
-type f
為-not -type d
,見上文):find -not -type d -links +1 -print0 | xargs -0 unhardlink.sh
您的腳本還有改進的空間,例如向命令添加一個
-p
選項,cp
以便在 unhardlink 操作中保留權限和時間戳,您可以添加一些錯誤處理,以便在出現錯誤時刪除臨時文件,但是您的解決方案的基本思想是唯一可行的。要取消硬連結文件,您必須複製它,然後將副本移回原始名稱之上。沒有“不那麼粗糙”的解決方案,並且該解決方案具有競爭條件,以防另一個程序同時訪問該文件。