用于在缓存搜索结果时删除精确重复文件的程序

用于在缓存搜索结果时删除精确重复文件的程序

我们需要一个 Windows 7 程序来删除/检查重复项,但我们的情况与有足够程序的标准情况有些不同。

我们有相当大的静止的分布在多个磁盘上的照片档案(集合)。我们称它们为 Disk A..M。我们还有一些磁盘(我们称它们为 Disk 1..9),其中包含一些在磁盘 A..M. 上找到的重复项

我们希望向我们的收藏中添加新的磁盘(N、O、P......),其中将包含磁盘 1..9 中的照片,但当然,我们不希望任何照片出现两次(或更多次)。

当然,理论上,这个任务可以通过常规的文件重复删除程序来解决,但所需的时间会非常长。

理想情况下,AFAIS 现在,真正的解决方案将是一个程序,它将扫描磁盘 A..M,将照片的文件大小/哈希值存储在索引数据库/文件中,并根据该数据库检查新磁盘(1..9)。

然而我很难找到这样的程序(如果存在的话)。

其他注意事项:

  • 我们认为 Disks A..M(集合)上没有任何重复项
  • 文件名可能会改变
  • 我们对某些照片比较程序中出现的近似(模糊)比较不感兴趣。我们寻找精确的重复文件。
  • 我们不怕命令行。:-)
  • 我们需要在 Win7/XP 上工作
  • 我们当然更愿意成为免费软件

答案1

根据 Dennis 的解决方案,我们决定使用哈希深度套件也适用于 Windows。

基本用法:

步骤 1. 生成哈希值(这只需执行一次)

hashdeep64 -c tiger -r "D:\*" > Disk_D.hash

我们用老虎作为哈希函数 -快点并且比 SHA-1 更好(无冲突)。

步骤 2:查找重复项(必须对要检查的每个驱动器/目录执行此操作)

hashdeep64 -k Disk_D.hash -m -r "E:\My-Dir-To-Check\*" > Dupes.txt

现在所有重复项都存储在Dupes.txt

您可以使用 MsWord、LibreOffice 或 Notepad++(或您知道的任何其他方式)在此文本文件中插入del(和/或任何其他选项)以删除文件。您有这里足够的变体,包括一个简单的 .bat 文件,它可以扫描文件列表以删除所有条目。

此外,您还可以选择查看文件列表并手动进行处理。

答案2

方法

  1. 选择无碰撞的哈希函数。

    我的示例使用 SHA1,因为无论如何瓶颈都会是硬盘。

    如果耗时太长,可以只比较文件的第一个兆字节。应该对于图像来说已经足够了。

  2. 读取磁盘 A..M 上感兴趣的文件,计算它们的哈希值并将它们存储在特定于该磁盘的文件中(以便您以后可以添加/删除磁盘)。

  3. 读取磁盘 1..9 上感兴趣的文件并计算其哈希值。

    如果文件的哈希值已知,则执行操作(列出或删除)。

设置

  1. 下载并安装赛格威,一组为 Windows 提供 Linux 外观和感觉环境的工具。

  2. 在 Windows 资源管理器中,打开文件夹%ProgramFiles(x86)%\Cygwin\home\%USERNAME%

  3. 编辑文件.bashrc并添加以下行:

    export PATH=~:$PATH
    
  4. 创建一个名为的文件hashdrive并将以下代码保存到其中:

    #!/bin/bash
    
    DRIVELETTER=$(echo $1 | tr '[:upper:]' '[:lower:]')
    EXTENSIONS=$(echo $2 | sed 's/,/\\|/g')
    DRIVENAME=$(echo $3 | tr '[:upper:]' '[:lower:]')
    
    set -e
    [ -d /cygdrive/$DRIVELETTER ] || (echo "Drive $DRIVELETTER: does not exist." ; exit 1)
    [ -f ~/drives/$DRIVENAME ] && (echo "Hashfile for drive $DRIVENAME already exists." ; exit 1)
    set +e
    
    mkdir ~/drives 2>/dev/null
    find /cygdrive/$DRIVELETTER -type f -iregex ".*\.\($EXTENSIONS\)" -exec sha1sum {} \; | cut -b -40 > ~/drives/$DRIVENAME
    
  5. 创建一个名为的文件checkdrive并将以下代码保存到其中:

    #!/bin/bash
    
    DRIVELETTER=$(echo $1 | tr '[:upper:]' '[:lower:]')
    EXTENSIONS=$(echo $2 | sed 's/,/\\|/g')
    ACTION=$(echo $3 | tr '[:upper:]' '[:lower:]')
    
    set -e
    [ -d /cygdrive/$DRIVELETTER ] || (echo "Drive $DRIVELETTER: does not exist." ; exit 1)
    set +e
    
    IFS=":" ; for FILE in `find /cygdrive/$DRIVELETTER -type f -iregex ".*\.\($EXTENSIONS\)" -printf %p:`; do
        [ "$(grep -m 1 $(sha1sum "$FILE" | cut -b -40) ~/drives/*)" ] && $ACTION "$FILE"
    done
    

用法

  • 要将某个磁盘的所有映像的哈希值保存到文件,请启动 Cygwin 并执行以下命令:

    hashdrive DRIVELETTER EXTENSIONS DRIVENAME
    

    例如,如果 DiskA 作为驱动器安装D:,并且您想要对所有带有扩展名和的图像进行哈希处理jpgpng请使用以下命令:

    hashdrive d jpg,png diska
    

    必须有中的空間jpg,png

  • 要检查磁盘是否有重复的映像,请启动 Cygwin 并执行以下命令:

    hashdrive DRIVELETTER EXTENSIONS ACTION
    

    例如,如果 Disk1 被安装为驱动器E:并且您想要列出所有带有扩展名jpg和的重复图像png,请使用以下命令:

    checkdrive e jpg,png echo
    

    如果要直接删除文件,请使用rm而不是echo

  • 要从数据库中删除磁盘,只需删除文件DRIVENAME夹中的文件%ProgramFiles(x86)%\Cygwin\home\%USERNAME%\drive

警告

rm命令确实不是将文件移动到回收站;它会直接删除它们。

尽管无论如何都应该可以恢复文件,但在使用操作时要小心,并在使用之前先rm尝试。echorm

相关内容