как указать fdupes, какие файлы сохранять?

как указать fdupes, какие файлы сохранять?

У меня возникли проблемы с резервным копированием, и теперь на моем жестком диске много папок. У меня есть одно основное «дерево папок», которое я хочу сохранить как есть. Как запретить 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

Вот короткий скрипт для установки приоритета для первого указанного каталога. Он не удаляет файлы напрямую, а только выводит список для удаления. Он следует следующим правилам:

  1. Не распечатывайте файлы изdir1
  2. Если какой-либо файл отсутствует в формате 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
    

    Сохраните его в файл, сделайте файл исполняемым и попробуйте запустить его.

Связанный контент