Recientemente tengo la necesidad de eliminar muchos duplicados. Estoy fusionando tres o cuatro sistemas de archivos, y quiero que el espacio se use económicamente. Al principio, fdupes
parecía que era la mejor herramienta para el trabajo, pero cada vez tengo más limitaciones.
Considera el comando fdupes -rdN somedirectory/
. Esto hace un hash de todos los archivos en los subdirectorios de somedirectory.
Y cuando encuentra duplicados, los elimina, de modo que solo hay una copia de todo.
Pero, ¿qué pasa si quiero mantener somedirectory/subdirectory1/somefile
y, de hecho, hay cuatro duplicados, y el programa encuentra uno de los duplicados primero? Luego se elimina somedirectory/subdirectory1/somefile
, lo que no quiero.
Quiero poder especificar, de alguna manera, qué duplicados mantener. Y hasta ahora, ninguno de los programas estándar para tratar con duplicados (duff, FSLint) parece permitir la automatización de ese tipo de comportamiento. Prefiero no rodar el mío, así que por eso estoy haciendo esta pregunta.
Me gustaría poder escribir algo como
killdupes -rdN --keep=filesin,somedirectories,separated,by,commas somedirectory/
fuente
Respuestas:
Si bien la funcionalidad que busca no está disponible en stock
fdupes
, bifurquéfdupes
(se llama mi forkjdupes
) y agregué algunas características que pueden resolver este problema en ciertas circunstancias. Por ejemplo, en el caso indicado en el que desea mantenersomedirectory/subdirectory1/somefile
cuando se eliminan automáticamente los duplicados (eld
yN
cambia juntos) y no hay archivos separados inmediatamente debajosomedirectory
,jdupes
se puede alimentar cada ruta de subdirectorio inmediato consubdirectory1
primero y el-O
interruptor (que clasifica los archivos por comando orden de parámetros de línea primero):jdupes -nrdNO somedirectory/subdirectory1 somedirectory/subdirectory2 somedirectory/subdirectory3
Esto eliminará automáticamente todos los archivos excepto uno en un conjunto duplicado y garantizará que si el conjunto contiene un archivo
somedirectory/subdirectory1
será el primero, convirtiéndose automáticamente en el archivo preservado en el conjunto. Todavía hay límites evidentes para este enfoque, como el hecho de quesomedirectory/subdirectory1
podría conservarse otro duplicado en lugar del que desea conservar, pero en un buen número de casos como el suyo, lajdupes
opción de orden de parámetros como solución alternativa es lo suficientemente buena.En un futuro próximo, planeo agregar un sistema de filtrado
jdupes
que permita un gran control sobre la inclusión / exclusión de archivos, la preservación de-N
acciones y la aplicación de tales "pilas de filtros" en forma global o por parámetro. Esta característica es muy necesaria; Imagino algo como esto para "eliminar automáticamente los duplicados distintos de cero de forma recursiva PERO siempre preservarlosomedirectory/subdirectory1/somefile
tal cual":jdupes -nrdN --filter=preserve:somedirectory/subdirectory1/somefile somedirectory/
fuente
¿Qué hay de vincular los archivos duplicados juntos? De esa manera, el espacio solo se usa una vez, pero todavía existen en todos los caminos. El problema con esto es que los archivos enlazados deben modificarse en su lugar (solo deben modificarse eliminando el archivo y recreándolo con el nuevo contenido). El otro enfoque es vincular los archivos juntos, aunque tiene el mismo problema de decidir cuál es el archivo "primario". Esto podría hacerse con el siguiente script (aunque tenga en cuenta que esto no maneja los nombres de archivo que contienen espacios).
fuente
jdupes
lugar defdupes
usted simplemente puede ir,jdupes -nrL somedirectory/
que es masivamente más rápido.No vi este en ningún otro lugar: di lo que quieres es esto. Tienes / mnt / folder-tree-1 / mnt / folder-tree-2. No desea eliminar todos los duplicados, pero si existe un archivo en el árbol-2 y existe un archivo idéntico en el árbol-1 con la misma ruta y nombre, elimínelo del árbol-2.
Advertencia: esto es bastante breve y si intenta copiar y pegar esto con habilidades limitadas de shell, tenga cuidado.
O todo en una línea:
Luego, inspeccione y ejecute rm-v2-dupes.sh
fuente
Tenía la misma pregunta. Si tienes muchos duplicados
fdupes /my/directory/ -rdN
mantiene el archivo con la fecha de modificación más antigua, o si varios archivos tienen la misma fecha de modificación, entonces el primero se encuentra.Si la fecha de modificación no es importante para usted, puede
touch
guardar los archivos en el directorio que desea conservar. Si los eligestouch
con la fecha y hora actualesfdupes -rdNi
, mantendrás las que tengan la fecha actual. O puedetouch
guardar los archivos con una fecha anterior a la de los que desea eliminar y usar defdupes -rdN
forma normal.Si necesita mantener la fecha de modificación, deberá usar uno de los otros métodos.
fuente
Solo para agregar un giro a una respuesta anterior. He usado el siguiente código varias veces, modificando ligeramente una respuesta anterior con un simple
| grep
para aislar la carpeta de la que quiero eliminar.Nuevamente, esto creará un archivo sh para eliminar todos los archivos enumerados, sin líneas comentadas. Por supuesto, aún puede editar el archivo para comentar líneas / archivos específicos que desea conservar.
Otro consejo para directorios grandes es ejecutar fdupes en un archivo txt, luego experimentar con
| grep
y| sed
hasta obtener el resultado que quiero.fuente
Úselo
sed
para crear un archivo de shell que contendrá comandos comentados para eliminar cada uno de sus archivos duplicados:El
remove-duplicate-files.sh
archivo resultante que acabamos de crear tendrá cada línea comentada. Descomente los archivos que desea eliminar. Entonces corresh remove-duplicate-files.sh
. Voila!ACTUALIZAR
Bueno, si no desea eliminar archivos solo en ciertos directorios, es tan simple como esto :
Donde
exclude_duplicates.py
es:El
remove-duplicate-files-keep-protected.sh
archivo resultante que acabamos de crear tendrá todos los archivos de directorios protegidos comentados. Abra este archivo en su editor de texto favorito, verifique que todo esté bien. Entonces ejecútalo. Voila (sic)!fuente
¿Qué tal algo como esto?
fuente