Unix

斷開文件夾中的所有硬連結

  • February 8, 2019

我有一個文件夾,其中包含一定數量的文件,這些文件具有硬連結(在同一個文件夾或其他地方),我想取消這些文件的硬連結,因此它們變得獨立,並且對其內容的更改不會影響任何其他文件(它們的連結數變為 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 操作中保留權限和時間戳,您可以添加一些錯誤處理,以便在出現錯誤時刪除臨時文件,但是您的解決方案的基本思想是唯一可行的。要取消硬連結文件,您必須複製它,然後將副本移回原始名稱之上。沒有“不那麼粗糙”的解決方案,並且該解決方案具有競爭條件,以防另一個程序同時訪問該文件。

引用自:https://serverfault.com/questions/386514