溫馨提示×

Linux磁盤清理技巧:如何刪除重復文件

小樊
53
2025-10-02 10:52:51
欄目: 智能運維

Linux下刪除重復文件的高效技巧

在Linux系統中,重復文件會占用大量磁盤空間,尤其是當同一文件被保存到不同目錄或以不同名稱存儲時。以下是通過識別inode值(文件唯一標識)和哈希校驗兩種常用方法,安全刪除重復文件的詳細步驟:

一、通過inode值識別并刪除重復文件(硬鏈接)

原理:硬鏈接是文件的多個名稱指向同一個inode(包含文件元數據的結構),刪除其中一個硬鏈接不會影響其他鏈接,但刪除所有硬鏈接后會釋放空間。
步驟

  1. 查看當前目錄下文件的inode值
    使用ls -i命令列出文件及其inode號,相同inode號的文件即為硬鏈接。例如:

    ls -i myfile mycopy mytwins
    

    輸出結果中,若myfile、mycopy、mytwins的inode號相同(如788000),則它們是硬鏈接。

  2. 批量找出所有重復的inode
    ls -i的結果排序并提取重復的inode號,便于后續處理:

    ls -i | sort -n > /tmp/inode_list.txt
    

    使用awkuniq命令找出重復的inode(需手動檢查/tmp/inode_list.txt):

    awk '{print $1}' /tmp/inode_list.txt | sort | uniq -d
    
  3. 刪除重復的硬鏈接(保留一個)
    編寫腳本遍歷重復的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)也會相同。這種方法適用于識別“內容重復”的文件(而非硬鏈接)。
步驟

  1. 安裝必要工具
    大多數Linux發行版自帶md5sum(計算MD5哈希)、sha256sum(計算SHA256哈希)工具,無需額外安裝。

  2. 計算目錄下所有文件的哈希值
    使用find命令遍歷目錄,計算每個文件的哈希值并保存到臨時文件:

    find /path/to/search -type f -exec md5sum {} + > /tmp/file_hashes.txt
    

    示例中/path/to/search替換為需要搜索的目錄(如~表示家目錄),+表示批量處理以提高效率。

  3. 找出重復的哈希值
    使用sortuniq命令篩選出重復的哈希值(-D選項顯示所有重復行):

    sort /tmp/file_hashes.txt | uniq -D -w 32
    

    -w 32表示只比較每行前32個字符(MD5哈希的長度),避免因文件名不同導致的誤判。

  4. 刪除重復文件(保留一個)
    提取重復哈希值對應的文件列表,保留第一個文件,刪除其余文件。例如:

    #!/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復制目錄到外部存儲),避免誤刪導致數據丟失。
  • 區分硬鏈接與符號鏈接:符號鏈接(軟鏈接)是指向目標文件的快捷方式,有自己的inode值,刪除符號鏈接不會影響目標文件??赏ㄟ^ls -l查看文件類型(l開頭為符號鏈接)。
  • 測試腳本:首次使用腳本時,可將rm命令改為echo(如echo "Would delete: $file"),預覽將要刪除的文件,確認無誤后再恢復rm命令。

通過以上方法,可高效識別并刪除Linux系統中的重復文件,釋放寶貴的磁盤空間。根據實際需求選擇合適的方法(硬鏈接適合識別“同一文件的不同名稱”,哈希校驗適合識別“內容相同的文件”),確保操作安全。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女