![用于在缓存搜索结果时删除精确重复文件的程序](https://linux22.com/image/1321261/%E7%94%A8%E4%BA%8E%E5%9C%A8%E7%BC%93%E5%AD%98%E6%90%9C%E7%B4%A2%E7%BB%93%E6%9E%9C%E6%97%B6%E5%88%A0%E9%99%A4%E7%B2%BE%E7%A1%AE%E9%87%8D%E5%A4%8D%E6%96%87%E4%BB%B6%E7%9A%84%E7%A8%8B%E5%BA%8F.png)
我们需要一个 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
方法
选择无碰撞的哈希函数。
我的示例使用 SHA1,因为无论如何瓶颈都会是硬盘。
如果耗时太长,可以只比较文件的第一个兆字节。应该对于图像来说已经足够了。
读取磁盘 A..M 上感兴趣的文件,计算它们的哈希值并将它们存储在特定于该磁盘的文件中(以便您以后可以添加/删除磁盘)。
读取磁盘 1..9 上感兴趣的文件并计算其哈希值。
如果文件的哈希值已知,则执行操作(列出或删除)。
设置
下载并安装赛格威,一组为 Windows 提供 Linux 外观和感觉环境的工具。
在 Windows 资源管理器中,打开文件夹
%ProgramFiles(x86)%\Cygwin\home\%USERNAME%
。编辑文件
.bashrc
并添加以下行:export PATH=~:$PATH
创建一个名为的文件
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
创建一个名为的文件
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:
,并且您想要对所有带有扩展名和的图像进行哈希处理jpg
,png
请使用以下命令: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
尝试。echo
rm