4

Я прочитал часто задаваемые вопросы, и я знаю, что это близко к тому, чтобы быть закрытым, как просить рекомендации продукта ...

Я просмотрел как минимум 40 утилит для удаления "дубликатов файлов" (Windows, OSX и Linux), и ни одна из них не обладает той особой функцией, которую я ищу.

Мне нужно сейчас, если есть что-нибудь, что может сделать это, или если мне придется написать свой собственный инструмент для этого.

Просто ответ "Да, он существует" будет хорошо для меня.
Это означало бы, что я просто недостаточно усердно искал.

Моя обязательная функция: удалять дубликаты файлов в большой структуре папок, но ТОЛЬКО если дубликаты находятся в той же папке.
Скажем, у меня есть файлы A, B и C, которые идентичны. А и С находятся в одной папке. B находится в другой папке. Либо A, либо C необходимо удалить (без предпочтений), но B следует оставить в покое.

Есть ли что-то, что может это сделать?
(Предпочтительно Windows, но OS-X или Linux тоже в порядке.)

3 ответа3

5

Как я уже сказал, я разработал скрипт Python, который делает именно это.

Я разместил его в Google Code и открыл его как GPL v3, поэтому я предполагаю, что любой, кто хочет улучшить программу, сможет это сделать.

Я также несколько отладил (создал десятки файлов в Windows, удалил все, оставив оригиналы). Код высоко комментируется, чтобы сообщить кому-либо о том, что на самом деле делает код.

Я запустил его на Python 3.3, но я предполагаю, что он должен работать с последним Python 2.

О, и лучшая часть, это должно работать на любой ОС, поддерживаемой Python (Windows, OSX, Linux, ...)

3

Вы можете использовать fdupes без -r чтобы он не переходил в подкаталоги. Это печатает список дубликатов файлов:

find . -type d -exec fdupes -n {} \;

-n игнорирует пустые файлы. Добавить -dN --delete --noprompt , чтобы удалить все , кроме первого файла дубликата.

Вы можете установить fdupes на OS X с помощью brew install fdupes .

1

Это медленный, но верный и очень простой подход, который должен работать как в OSX, так и в Linux. Я предполагаю, что вы заинтересованы в дубликатах файлов, находящихся в вашем $HOME но вы можете изменить это в соответствии со своими потребностями.

Идея состоит в том, чтобы сначала найти список всех каталогов, затем сравнить файлы внутри них и удалить все идентичные. Как я уже сказал, это очень упрощенно, поэтому он просто сохранит первый из любой пары файлов и удалит остальные без предупреждения.

Это распечатает дубликаты, но не внесет никаких изменений в ваши файлы:

find $HOME  -mindepth 1 -type d | while read dir; do 
  find $dir -type -f -exec md5sum {} \; | sort > md5sums;
  gawk '{print $1}' md5sums | sort | uniq -d > dupes;
  while read d; do 
    echo "---"; grep -w $d md5sums | cut -d ' ' -f 2-;
  done < dupes
done; rm dupes md5sum 

Этот файл автоматически удалит дубликаты файлов, запустите его, только если вы уверены, что все в порядке:

find $HOME  -mindepth 1 -type d | 
while read dir; do 
  find $dir -type -f -exec md5sum {} \; | sort > md5sums;
  gawk '{print $1}' md5sums | sort | uniq -d |
  while read d; do grep -w $d md5sums | cut -d ' ' -f 2- | tail -n +2; done |
  | xargs rm ; 
done; rm dupes md5sum 

ПРЕДОСТЕРЕЖЕНИЯ: Это медленно, на самом деле МЕДЛЕННО, не будет выдавать предупреждения и будет удалять файлы без вывода сообщений. С другой стороны, он будет делать это только в том случае, если эти файлы находятся в той же папке, что и вы.

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