У меня возникли проблемы с резервным копированием, и теперь на моем жестком диске много папок. У меня есть одно основное «дерево папок», которое я хочу сохранить как есть. Как запретить fdupes удалять файлы в каталогах, которые я не хочу удалять?
Может быть, есть другая утилита для поиска дубликатов?
решение1
Может быть, есть другая утилита для поиска дубликатов?
Использоватьрмлинт, он делает именно то, что вам нужно, используя опцию --keep-all-tagged:
$ rmlint --types=duplicates --keep-all-tagged /path/to/dupes /other/path/to/dupes // main/folder/tree
решение2
Почему бы не замедлить процесс и не проявить осторожность?
Получите сравнение дубликатов fdupes
и сохраните его в файле.
fdupes -r /path/to/start > filesToDelete
Затем, в удобном для вас темпе, вы можете удалить любые каталоги или файлы, которые вы хотите сохранить изfilesToDelete
Чтобы удалить целые каталоги
sed -i '|/directoryToKeep/|d' filesToDelete
Проработайте текст filesToDelete
в предпочитаемом вами текстовом редакторе и поставьте маркер (может быть, x?) в начале копии каждого файла, который вы хотитедержатьчтобы вы могли отслеживать, что вы сделали, а затем, когда вы будете уверены в изменениях
cat aFile | xargs -d "\n" rm
rm
выдаст ошибку в каждой строке с x (а также в любом комментарии или других строках, сгенерированных fdupes
), но ничего не сделает с этими файлами. Однако он удалит все неотмеченные допустимые записи имен файлов в filesToDelete
.
решение3
Вот короткий скрипт для установки приоритета для первого указанного каталога. Он не удаляет файлы напрямую, а только выводит список для удаления. Он следует следующим правилам:
- Не распечатывайте файлы из
dir1
Если какой-либо файл отсутствует в формате
dir1
, то не печатайте его.#!/usr/bin/env bash # priority_dup.sh dir1 dir2 [dir3 ...]` set1=() # List collects all matching files for a set. IFS=$'\n' fdupes -r "$@" | while read i; do if [[ "$i" == "" ]]; then # Create new set, minus all files from dir1. set2="$(echo "${set1[*]}" | grep -v "^$1/")" # If the sets are different, then we can print files for deletion. if [[ "${set1[*]}" != "$set2" && "$set2" != "" ]]; then echo "$set2" echo "" set1=() fi else set1+=("$i") fi done
Сохраните его в файл, сделайте файл исполняемым и попробуйте запустить его.