Tive problemas com meu backup e agora tenho muitas pastas diversas vezes no meu HD. Eu tenho uma 'árvore de pastas' principal, que quero manter como está. Como posso evitar que o fdupes exclua arquivos em diretórios que não quero que sejam excluídos?
Existe talvez outro utilitário de localização de duplicatas?
Responder1
Existe talvez outro utilitário de localização de duplicatas?
Usarrmlint, ele faz exatamente o que você deseja usando a opção --keep-all-tagged:
$ rmlint --types=duplicates --keep-all-tagged /path/to/dupes /other/path/to/dupes // main/folder/tree
Responder2
Por que não desacelerar o processo e tomar alguns cuidados
Obtenha a comparação de duplicatas fdupes
e coloque-a em um arquivo.
fdupes -r /path/to/start > filesToDelete
Então, no seu próprio ritmo, você pode remover quaisquer diretórios ou arquivos que deseja manter dofilesToDelete
Para remover diretórios inteiros
sed -i '|/directoryToKeep/|d' filesToDelete
Trabalhe filesToDelete
em seu editor de texto preferido e coloque um marcador (talvez um x?) no início da cópia de cada arquivo que desejamanterpara que você possa acompanhar o que fez e, então, quando tiver certeza das alterações
cat aFile | xargs -d "\n" rm
rm
lançará um erro em cada linha com um x (bem como em qualquer comentário ou outras linhas geradas por fdupes
), mas não fará nada com esses arquivos. No entanto, ele excluirá todas as entradas de nomes de arquivo válidos não marcadas em filesToDelete
.
Responder3
Aqui está um pequeno script para priorizar o primeiro diretório fornecido. Ele não exclui arquivos diretamente, apenas imprime uma lista para você excluir. Segue estas regras:
- Não imprima nenhum arquivo de
dir1
Se algum arquivo não estiver em
dir1
, não o imprima.#!/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
Salve-o em um arquivo, defina-o como executável e execute-o.