温馨提示×

Linux磁盘清理技巧:如何删除重复文件

小樊
58
2025-10-02 10:52:51
栏目: 智能运维

Linux下删除重复文件的高效技巧

在Linux系统中,重复文件会占用大量磁盘空间,尤其是当同一文件被保存到不同目录或以不同名称存储时。以下是通过识别inode值(文件唯一标识)和哈希校验两种常用方法,安全删除重复文件的详细步骤:

一、通过inode值识别并删除重复文件(硬链接)

原理:硬链接是文件的多个名称指向同一个inode(包含文件元数据的结构),删除其中一个硬链接不会影响其他链接,但删除所有硬链接后会释放空间。
步骤

  1. 查看当前目录下文件的inode值
    使用ls -i命令列出文件及其inode号,相同inode号的文件即为硬链接。例如:

    ls -i myfile mycopy mytwins
    

    输出结果中,若myfilemycopymytwins的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