我把所有摄影文件的多个备份合并在一起,发现很多文件都有多个副本。并非所有文件都是副本,有些是经过 Photoshop 处理的。现在我注意到“fdupes”可以帮助我识别重复文件并删除每个文件。
现在有一个问题..
假设我有这个文件夹结构:
/Photoshoot X copy 1/*
/Photoshoot X copy 1/selection/*
/Photoshoot X copy 2/*
/Photoshoot X copy 2/selection/*
中的许多文件(如果不是全部的话)copy 2
都是 中的文件的副本copy 1
。这些文件可以删除。但是!文件夹中的一些文件(如果不是全部的话)selection
是根文件夹中文件的直接副本。这些文件应该不是删除,即使它们是重复的。它们不应该被删除,因为即使它们是重复的,它们也会被复制,因为它们是整个集合中最重要的。
现在我的问题是:是否可以批量比较相对于其路径的文件?
因此,只比较两个根文件夹,而不是将根文件夹与文件夹的内容进行比较selection
。
答案1
在Linux环境中可以安装fdupes
步骤1,获取重复文件列表
fdupes -f basedirectory/ > list.txt
第 2 步,过滤掉/selection/
目录中的重复项
grep -v "/selection/" list.txt > script.sh
步骤 3 编写script.sh
一个脚本,使用全局搜索和替换删除文件,rm
在每一行的开头放置一个删除命令。使用您最喜欢的文本编辑器,或者sed
如果您愿意的话。在这里检查你的工作,这些是消失的文件。 如果文件名中有空格或其他特殊字符,请多加注意。您可能需要rm "
在行首和"
行末各放置一个,才能解决这个问题。
perl -p -i -e 's/^(.*)$/rm "\1"/' script.sh
应该可以工作,但在执行之前请检查文件以确保它是你想要的。
步骤 4 执行新脚本。这是触发。
sh -x script.sh
步骤 5 清除临时文件list.txt
并script.sh
毫无疑问,人们可以用合适的替代来修改 Windows 命令行的工作流程。
答案2
findDups.pl
在你的 Mac 上运行下面的 perl 脚本(替换dir_to_scan
为要扫描重复项的目录):
$ findDups.pl dir_to_scan > rmdups.sh
rmdups.sh
在运行脚本之前最后看一下:
$ sh rmdups.sh
#!/usr/bin/perl
# Usage: findDups.pl dir_to_scan
use strict;
use warnings;
use File::Find 'find';
use Digest::MD5 'md5';
my $dir = shift @ARGV || '.';
my %files;
find(\&wanted, $dir);
sub wanted {
my $localname = $_;
my $path = $File::Find::name;
return if $path =~ m#/selection/#;
return unless -f $localname;
my $md5 = md5($localname);
push(@{$files{$md5}}, $path);
}
while (my($key, $value) = each(%files)) {
while (@{$files{$key}} > 1) {
my $doomed = shift @{$files{$key}};
print 'rm \'' . $doomed . '\'' . $/;
}
}