¿Cómo decirle a fdupes qué archivos conservar?

¿Cómo decirle a fdupes qué archivos conservar?

He tenido problemas con mi copia de seguridad y ahora tengo muchas carpetas varias veces en mi HD. Tengo un 'árbol de carpetas' principal, que quiero mantener como está. ¿Cómo puedo evitar que fdupes elimine archivos en directorios que no quiero que elimine?

¿Existe tal vez otra utilidad de búsqueda de duplicados?

Respuesta1

¿Existe tal vez otra utilidad de búsqueda de duplicados?

Usarrmlint, hace exactamente lo que quieres usando la opción --keep-all-tagged:

$ rmlint --types=duplicates --keep-all-tagged /path/to/dupes /other/path/to/dupes // main/folder/tree

Respuesta2

¿Por qué no ralentizar el proceso y tener algo de cuidado?

Obtenga la comparación de duplicados fdupesy colóquela en un archivo.

fdupes -r /path/to/start > filesToDelete

Luego, a su propio ritmo, puede eliminar cualquier directorio o archivo que desee conservar delfilesToDelete

Para eliminar directorios completos

sed -i '|/directoryToKeep/|d' filesToDelete 

Trabaja filesToDeleteen tu editor de texto preferido y coloca un marcador (¿tal vez una x?) al comienzo de la copia de cada archivo que desees.mantenerpara que puedas realizar un seguimiento de lo que has hecho y luego, cuando estés seguro de los cambios

cat aFile | xargs -d "\n" rm

rmarrojará un error en cada línea con una x (así como en cualquier comentario u otras líneas generadas por fdupes) pero no hará nada con esos archivos. Sin embargo, eliminará todas las entradas de nombres de archivos válidas no marcadas en formato filesToDelete.

Respuesta3

Aquí hay un breve guión para priorizar la primera directiva dada. No elimina archivos directamente, solo imprime una lista para que usted los elimine. Sigue estas reglas:

  1. No imprima ningún archivo dedir1
  2. Si algún archivo no está en dir1, no lo 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
    

    Guárdelo en un archivo, configúrelo como ejecutable y ejecútelo.

información relacionada