如何在ubuntu上刪除硬連結而不遺失原始檔案?

如何在ubuntu上刪除硬連結而不遺失原始檔案?

我在 ubuntu 上並且使用dropbox.問題是我遇到一些同步問題,因為我的圖片資料夾中有很多硬連結。

如何用一個簡單的命令刪除所有它們而不丟失任何圖片?對於單一文件,我找到了以下命令

find /home -xdev -samefile "filename" | xargs rm

但我不知道如何對所有文件執行此操作?

提前謝謝

有關我的文件系統的資訊:

Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  7,7G     0  7,7G   0% /dev
tmpfs          tmpfs     1,6G  2,4M  1,6G   1% /run
/dev/nvme0n1p3 ext4      435G  203G  211G  50% /
tmpfs          tmpfs     7,7G  756M  7,0G  10% /dev/shm
tmpfs          tmpfs     5,0M  4,0K  5,0M   1% /run/lock

答案1

只要一個檔案有多個硬鏈接,您就可以刪除它,當最後一個硬鏈接被刪除時,資料將被刪除。可以使用 (*) 檢索連結數量stat -c '%h' {file},因此您可以刪除具有多個硬連結的所有文件,如下所示:

for file in *
do
   links=$(stat -c '%h' "$file")
   [[ -f "$file" ]] && [[ $links -gt 1 ]] && rm "$file" 
done

正如他們所說,最終,只會有一個,倖存者將是最後一個檢查的,取決於目錄處理順序、字母順序等...

(*)它也出現在 的輸出中ls -l,但這更難解析...

答案2

您可以刪除“額外的”所有文件的副本如下:

find /home -xdev -type f -links +1 -delete

但應該注意,其中一些額外的副本可能會硬連結到外部的地方/home(並且可能看起來丟失)。

-links +1指示僅選擇具有多個硬連結的find檔案 ( )。-type f

您可以(需要更多工作)使用find列印每個文件的 inode 值並對結果進行排序,並(使用awk)編寫要通過 刪除的文件列表xargs,但這樣做會遇到帶有特殊字元(包括空格)的文件名的問題。但這就是如何消除文件連結到外部時的意外/home

答案3

在 Unix/Linux/MacOS 中,目錄中的檔案名稱引用 inode(間接節點),即磁碟上的結構真的是文件。名稱與索引節點的這種關聯稱為硬連結軟連結這本質上只是一個包含可以在其下方找到該檔案的名稱的檔案。如果重新命名或刪除連結到的檔案的路徑的某些部分,軟連結可能會中斷,而重新命名/移動一個硬連結則根本不會影響其他連結。

因此,不存在“原始文件”,全部硬連結具有完全相同的狀態。 inode 記錄有多少個硬連結引用該文件(ls -l將此數字顯示為第二個欄位;對於文件,通常為1(僅一個連結),對於目錄,通常為2(父級中的連結和目錄中的“ .”)目錄本身;如果有子目錄,則每個子目錄都透過“..”引用其父目錄,因此計數會增加)。當連結計數達到 0 時,回收文件使用的空間。

相關內容