Я объединил несколько резервных копий всех моих файлов фотографий и наткнулся на несколько копий многих файлов. Не все файлы являются копиями, а некоторые - фотографиями. Теперь я заметил «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 папки.

2 ответа2

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 с помощью подходящих положений.

1

Запустите приведенный ниже скрипт perl findDups.pl на вашем Mac (заменив 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 . '\'' . $/;
  }
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .