В последнее время мне необходимо удалить много дубликатов. Я объединяю три или четыре файловые системы и хочу, чтобы пространство использовалось экономно. Поначалу fdupes
казалось, что это лучший инструмент для работы, но я все больше сталкиваюсь с ограничениями.
Рассмотрим команду fdupes -rdN somedirectory/
. Это делает хэш всех файлов в подкаталогах некоторого каталога.
И когда он встречает дубликаты, он удаляет их, так что остается всего одна копия всего.
Но что, если я захочу сохранить, somedirectory/subdirectory1/somefile
и на самом деле будет четыре дубликата, и программа сначала обнаружит один из дубликатов? Затем он удаляет somedirectory/subdirectory1/somefile
, что я не хочу.
Я хочу как-то указать, какие дубликаты сохранить. И до сих пор ни одна из стандартных программ для работы с дубликатами (duff, FSLint), по-видимому, не позволяет автоматизировать такого рода поведение. Я бы предпочел не кататься, поэтому я задаю этот вопрос.
Я хотел бы иметь возможность написать что-то вроде
killdupes -rdN --keep=filesin,somedirectories,separated,by,commas somedirectory/
источник
Ответы:
Хотя нужная вам функция недоступна в наличии
fdupes
, я раздвоилfdupes
(называется моя форкjdupes
) и добавил некоторые функции, которые могут решить эту проблему при определенных обстоятельствах. Например, в указанном случае, когда вы хотите сохранитьsomedirectory/subdirectory1/somefile
при автоматическом удалении дубликатов (иd
иN
переключатели вместе), и нет сразу же отдельных файловsomedirectory
,jdupes
можно указать каждый непосредственный путь к подкаталогуsubdirectory1
первым и-O
ключом (который сортирует файлы по команде -линейный параметр порядка первым):jdupes -nrdNO somedirectory/subdirectory1 somedirectory/subdirectory2 somedirectory/subdirectory3
Это автоматически удалит все файлы, кроме одного, в дублирующем наборе и будет гарантировать, что, если в наборе есть файл,
somedirectory/subdirectory1
он будет первым, что автоматически станет сохраненным файлом в наборе. У этого подхода все еще есть явные ограничения, такие как тот факт, чтоsomedirectory/subdirectory1
может быть сохранен другой дубликат вместо того, который вы хотели бы сохранить, но во многих случаях, таких как ваш,jdupes
опция порядка параметров в качестве обходного пути достаточно хороша.В ближайшем будущем я планирую добавить систему фильтрации
jdupes
, которая обеспечит огромный контроль над включением / исключением файлов, сохранением для-N
действий и применением таких «наборов фильтров» как на глобальном уровне, так и для каждого параметра. Эта функция крайне необходима; Я предполагаю что-то вроде этого, чтобы "автоматически удалять ненулевые дубликаты рекурсивно, НО всегда сохранятьsomedirectory/subdirectory1/somefile
как есть":jdupes -nrdN --filter=preserve:somedirectory/subdirectory1/somefile somedirectory/
источник
Как насчет жесткого связывания дубликатов файлов вместе? Таким образом, пространство используется только один раз, но они все еще существуют на всех путях. Суть в том, что жестко связанные файлы должны быть изменены на месте (их следует изменять только удаляя файл и создавая его заново с новым содержимым). Другой подход состоит в том, чтобы объединить файлы вместе, хотя у вас есть одна и та же проблема - решить, какой файл является «основным». Это можно сделать с помощью следующего сценария (хотя обратите внимание, что он не обрабатывает имена файлов, содержащие пробелы).
источник
jdupes
вместоfdupes
вас может просто пойти,jdupes -nrL somedirectory/
что намного быстрее.Я нигде не видел этого: Скажи, что ты хочешь, это. У вас есть / mnt / folder-tree-1 / mnt / folder-tree-2. Вы не хотите удалять все дубли, но если в tree-2 существует файл, а в tree-1 существует идентичный файл с точно таким же путем и именем, удалите его из tree-2.
Предупреждение: это довольно кратко, и если вы попытаетесь скопировать и вставить это с ограниченными навыками оболочки, будьте осторожны.
Или все в одной строке:
После этого проверьте и выполните rm-v2-dupes.sh.
источник
У меня такой же вопрос. Если у вас много дубликатов,
fdupes /my/directory/ -rdN
сохраните файл с самой старой датой изменения, или если несколько файлов имеют одинаковую дату изменения, то файл будет найден первым.Если дата изменения не важна для вас, вы можете
touch
сохранить файлы в каталоге, который хотите сохранить. Если вы выберете дляtouch
них текущую дату и время, тоfdupes -rdNi
сохраните их с текущей датой. Или вы можетеtouch
сохранить файлы с более ранней датой, чем те, которые вы хотите удалить, и использовать ихfdupes -rdN
как обычно.Если вам нужно сохранить дату изменения, вам нужно будет использовать один из других методов.
источник
Просто чтобы добавить поворот к предыдущему ответу. Я использовал следующий код несколько раз, слегка изменив предыдущий ответ, просто
| grep
изолировав папку, из которой я хочу удалить.Опять же, это создаст sh-файл для удаления всех файлов в списке, без комментариев. Конечно, вы все равно можете отредактировать файл, чтобы закомментировать определенные строки / файлы, которые вы хотите сохранить.
Еще один совет для больших каталогов - запускать fdupes в текстовый файл, затем экспериментировать с
| grep
и| sed
до тех пор, пока я не получу нужный результат.источник
Используйте
sed
для создания файла оболочки, который будет содержать закомментированные команды для удаления каждого из ваших дубликатов файлов:Полученный
remove-duplicate-files.sh
файл, который мы только что создали, будет закомментирован в каждой строке. Раскомментируйте файлы, которые вы хотите удалить. Тогда бегиsh remove-duplicate-files.sh
. Вуаля!ОБНОВИТЬ
Ну, если вы не хотите удалять файлы только в определенных каталогах, это так просто :
Где
exclude_duplicates.py
находится:В результате
remove-duplicate-files-keep-protected.sh
только что созданный нами файл закомментирует все файлы из защищенных каталогов. Откройте этот файл в вашем любимом текстовом редакторе, проверьте, что все в порядке. Тогда запустите это. Вуаля!источник
Как насчет этого?
источник