在Linux系統中,重復文件會占用大量磁盤空間,尤其是當同一文件被保存到不同目錄或以不同名稱存儲時。以下是通過識別inode值(文件唯一標識)和哈希校驗兩種常用方法,安全刪除重復文件的詳細步驟:
原理:硬鏈接是文件的多個名稱指向同一個inode(包含文件元數據的結構),刪除其中一個硬鏈接不會影響其他鏈接,但刪除所有硬鏈接后會釋放空間。
步驟:
查看當前目錄下文件的inode值:
使用ls -i
命令列出文件及其inode號,相同inode號的文件即為硬鏈接。例如:
ls -i myfile mycopy mytwins
輸出結果中,若myfile
、mycopy
、mytwins
的inode號相同(如788000
),則它們是硬鏈接。
批量找出所有重復的inode:
將ls -i
的結果排序并提取重復的inode號,便于后續處理:
ls -i | sort -n > /tmp/inode_list.txt
使用awk
或uniq
命令找出重復的inode(需手動檢查/tmp/inode_list.txt
):
awk '{print $1}' /tmp/inode_list.txt | sort | uniq -d
刪除重復的硬鏈接(保留一個):
編寫腳本遍歷重復的inode,使用find
命令刪除除第一個文件外的所有硬鏈接。例如:
#!/bin/bash
prev="" # 記錄上一個inode號
while read line; do
inode=$(echo $line | awk '{print $1}')
file=$(echo $line | awk '{print $2}')
if [ "$inode" == "$prev" ]; then
echo "Deleting duplicate hard link: $file"
rm "$file" # 刪除重復文件(保留$prev對應的文件)
else
prev=$inode
fi
done < /tmp/inode_list.txt
運行腳本前,建議先預覽/tmp/inode_list.txt
確認重復文件,避免誤刪。
原理:即使文件名不同、路徑不同,只要文件內容完全一致,其哈希值(如MD5、SHA256)也會相同。這種方法適用于識別“內容重復”的文件(而非硬鏈接)。
步驟:
安裝必要工具:
大多數Linux發行版自帶md5sum
(計算MD5哈希)、sha256sum
(計算SHA256哈希)工具,無需額外安裝。
計算目錄下所有文件的哈希值:
使用find
命令遍歷目錄,計算每個文件的哈希值并保存到臨時文件:
find /path/to/search -type f -exec md5sum {} + > /tmp/file_hashes.txt
示例中/path/to/search
替換為需要搜索的目錄(如~
表示家目錄),+
表示批量處理以提高效率。
找出重復的哈希值:
使用sort
和uniq
命令篩選出重復的哈希值(-D
選項顯示所有重復行):
sort /tmp/file_hashes.txt | uniq -D -w 32
-w 32
表示只比較每行前32個字符(MD5哈希的長度),避免因文件名不同導致的誤判。
刪除重復文件(保留一個):
提取重復哈希值對應的文件列表,保留第一個文件,刪除其余文件。例如:
#!/bin/bash
awk '{
hash = $1;
file = substr($0, index($0,$2)); # 提取文件名($2及之后的部分)
if (hash in seen) {
print "Deleting duplicate: " file;
rm -f "$file"; # 強制刪除(可根據需要改為-i交互確認)
} else {
seen[hash] = file;
}
}' /tmp/file_hashes.txt
運行腳本前,建議先預覽輸出的重復文件列表,確認無誤后再執行刪除操作。
cp -r
復制目錄到外部存儲),避免誤刪導致數據丟失。ls -l
查看文件類型(l
開頭為符號鏈接)。rm
命令改為echo
(如echo "Would delete: $file"
),預覽將要刪除的文件,確認無誤后再恢復rm
命令。通過以上方法,可高效識別并刪除Linux系統中的重復文件,釋放寶貴的磁盤空間。根據實際需求選擇合適的方法(硬鏈接適合識別“同一文件的不同名稱”,哈希校驗適合識別“內容相同的文件”),確保操作安全。