比较相对于彼此路径的校验和的文件吗?

比较相对于彼此路径的校验和的文件吗?

我把所有摄影文件的多个备份合并在一起,发现很多文件都有多个副本。并非所有文件都是副本,有些是经过 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.txtscript.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 . '\'' . $/;
  }
}

相关内容