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 fdupes
y 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 filesToDelete
en 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
rm
arrojará 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:
- No imprima ningún archivo de
dir1
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.