首页 > 解决方案 > 如何使用python查找具有相同内容但名称不同的重复文件?

问题描述

在进行文献研究时,我经常会遇到内容相同但名称不同的重复文件。如何使用python查找和删除重复文件?

标签: pythonfileduplicates

解决方案


您可以使用fdupes工具首先在给定的一组目录中查找重复文件,然后执行删除操作。fdupes在给定路径中搜索重复文件。通过比较文件大小和 MD5 签名来识别重复文件,然后进行逐字节比较。

  1. 首先检查重复文件:
fdupes -rf . | grep -v '^$' > files.txt
  1. 然后删除:
xargs -a files.txt rm -v

如果您不想将重复列表保留在单独的文件中,而只需要删除除第一个之外的所有副本,则可以发出:

fdupes -r -f . | grep -v '^$' | xargs rm -v

如果要手动将当前目录中的重复文件一个一个删除,并且每次删除前都需要确认,请发出:

fdupes -r -d .

fdupes命令通常不会默认安装,但它在大多数 Linux 发行版的存储库中都可用。如果您没有安装它,只需运行:

brew install fdupes         # For Mac OS X
sudo apt-get install fdupes # Debian based systems such as Ubuntu and Linux Mint
sudo yum install fdupes     # On CentOS/RHEL and Fedora based systems
sudo dnf install fdupes     # On Fedora 22 onwards

fdupes在 SLE 发行版上安装,您需要先添加存储库。

对于 SLE 11 SP4,以 root 身份运行以下命令:

zypper addrepo https://download.opensuse.org/repositories/home:paddg/SLE_11_SP4/home:paddg.repo
zypper refresh
zypper install fdupes

对于 SLE 11 SP3,以 root 身份运行以下命令:

zypper addrepo https://download.opensuse.org/repositories/home:paddg/SLE_11_SP3/home:paddg.repo
zypper refresh
zypper install fdupes

如果你想用 bash 写一些东西,你可以这样做:

#!/bin/bash
declare -A dupes
shopt -s globstar

for file in **; do
  [[ -f "$file" ]] || continue
   
  read cksm _ < <(md5sum "$file")
  if ((dupes[$cksm]++)); then 
    echo "rm $file" # Remove echo to perform the delete
  fi
done

请记住,这需要bash version 4.x能够使用关联数组和递归搜索。但这足以处理任何文件名和递归搜索。


推荐阅读