Come trovare ed eliminare file duplicati su Linux con jdupes

Quando si accumulano file nel tempo su hard disk, SSD o NAS, è inevitabile ritrovarsi con duplicati: foto scaricate più volte, documenti copiati in cartelle diverse, backup sovrapposti. Questi file occupano spazio prezioso e rendono difficile mantenere ordine nel filesystem.

jdupes è un tool open source da riga di comando per Linux che trova ed elimina file duplicati in modo veloce, sicuro ed efficiente. È il successore migliorato di fdupes, con prestazioni superiori e più funzionalità avanzate. La caratteristica più importante di jdupes è il suo algoritmo di verifica multi-stage: non si basa solo sugli hash per identificare i duplicati, ma esegue sempre un confronto byte-per-byte completo prima di dichiarare due file identici. Questo garantisce zero falsi positivi e massima sicurezza nelle operazioni di cancellazione.

In questa guida vedremo come installare jdupes, come usarlo per trovare duplicati salvando un log dettagliato, e come eliminare i file in sicurezza sia in modo interattivo che automatico.

Installazione

jdupes è disponibile nei repository ufficiali delle principali distribuzioni Linux:

bash
# Ubuntu/Debian
sudo apt install jdupes

# Fedora/RHEL
sudo dnf install jdupes

# Arch Linux
sudo pacman -S jdupes

Per verificare l’installazione:

bash
jdupes --version

Come funziona jdupes: l’algoritmo di verifica

jdupes usa un processo intelligente in più fasi per massimizzare sia la velocità che la sicurezza:

  1. Raggruppamento per dimensione: tutti i file vengono prima raggruppati per dimensione identica, scartando immediatamente quelli con dimensioni diverse
  2. Hash parziale: calcola un hash veloce dei primi 4096 byte per confronto rapido
  3. Hash completo: se l’hash parziale coincide, calcola l’hash completo del file usando xxHash
  4. Verifica byte-per-byte: fase finale e più importante, confronta i file bit per bit per confermare che siano effettivamente identici

Questo approccio garantisce che non ci siano mai falsi positivi: se jdupes dichiara che due file sono duplicati, lo sono davvero. L’opzione -Q (quick) permette di saltare la verifica byte-per-byte finale per velocizzare l’esecuzione, ma non dovrebbe mai essere usata quando si cancellano file.

Trovare duplicati e salvare un log

Comando base

Per cercare duplicati in una o più cartelle e salvare il risultato in un file di testo:

bash
jdupes -r /percorso/cartella > duplicati_log.txt
  • -r esegue la scansione ricorsiva in tutte le sottocartelle
  • > duplicati_log.txt redirige l’output su file invece che a schermo

L’output raggruppa i file duplicati insieme, con una riga vuota che separa ogni gruppo. Ad esempio:

/home/user/Documenti/foto.jpg
/home/user/Download/foto.jpg
/home/user/Backup/foto.jpg

/home/user/video.mp4
/home/user/Scaricati/video.mp4

Aggiungere informazioni sulla dimensione

bash
jdupes -r -S /percorso/cartella > duplicati_log.txt

L’opzione -S mostra la dimensione di ogni file duplicato nell’output, utile per capire quanto spazio si può recuperare.

Output con riepilogo finale

bash
jdupes -r -M /percorso/cartella > duplicati_log.txt

L’opzione -M stampa tutti i gruppi di duplicati e aggiunge alla fine un riepilogo che mostra:

  • Numero totale di file scansionati
  • Numero di gruppi di duplicati trovati
  • Spazio totale occupato dai duplicati
  • Spazio recuperabile eliminando i duplicati

Solo il riepilogo (senza lista completa)

bash
jdupes -r -m /percorso/cartella

L’opzione -m mostra solo il riepilogo finale senza elencare tutti i file, utile per una stima veloce.

Output in formato JSON

bash
jdupes -r -j /percorso/cartella > duplicati_log.json

L’opzione -j produce output in formato JSON strutturato, ideale se vuoi elaborare i risultati con script Python, jq o altri programmi.

Scansionare più cartelle contemporaneamente

bash
jdupes -r -M /home/user/Documenti /home/user/Download /media/backup > duplicati_log.txt

Puoi specificare più percorsi: jdupes troverà i duplicati anche tra cartelle diverse.

Eliminare i duplicati

Una volta identificati i duplicati, jdupes offre diverse modalità per eliminarli.

Modalità interattiva (consigliata per iniziare)

bash
jdupes -r -d /percorso/cartella

L’opzione -d attiva la modalità di cancellazione interattiva. Per ogni gruppo di duplicati, jdupes ti mostra l’elenco e ti chiede quale file vuoi preservare, permettendoti di scegliere manualmente. Tutti gli altri file del gruppo verranno eliminati.

Questa modalità è la più sicura per chi usa jdupes per la prima volta o quando non si è certi di quale file mantenere.

Modalità automatica (cancellazione senza conferma)

bashjdupes -r -d -N /percorso/cartella

L’opzione -N (no-prompt) mantiene automaticamente il primo file di ogni gruppo ed elimina tutti gli altri duplicati senza chiedere conferma.

Attenzione: questa modalità cancella immediatamente i file senza possibilità di annullare! Usala solo se sei sicuro e hai fatto un backup preventivo.

Controllare quale file mantenere con l’ordine dei parametri

bash
jdupes -r -d -N -O /cartella/da/mantenere /cartella/da/pulire

L’opzione -O (param-order) dice a jdupes di rispettare l’ordine in cui specifichi le cartelle: preserva sempre i file dalla prima cartella indicata.

Esempio pratico: hai duplicati tra ~/Documenti (cartella principale) e ~/Download (temporanea). Vuoi mantenere sempre i file da Documenti:

bash
jdupes -r -d -N -O ~/Documenti ~/Download

In questo modo i file in ~/Documenti vengono sempre preservati e i duplicati in ~/Download vengono eliminati.

Ordinamento personalizzato

bash
jdupes -r -d -N -o time /percorso/cartella

L’opzione -o permette di scegliere quale file mantenere in base a criteri specifici:

  • -o time mantiene il file più recente (per data di modifica)
  • -o name mantiene il file in base all’ordine alfabetico del nome (default)

Combinato con -i (reverse) puoi invertire l’ordine:

bash
jdupes -r -d -N -o time -i /percorso/cartella

Questo mantiene il file più vecchio invece del più recente.

Alternative alla cancellazione

Hard link: risparmiare spazio senza eliminare

bash
jdupes -r -L /percorso/cartella

L’opzione -L sostituisce i file duplicati con hard link senza chiedere conferma. Un hard link è un riferimento aggiuntivo allo stesso file fisico: i duplicati continuano ad apparire come file separati in percorsi diversi, ma occupano lo spazio di uno solo.

Vantaggi:

  • Risparmi spazio disco come se avessi cancellato
  • Tutti i percorsi rimangono accessibili
  • Modificare un file modifica automaticamente tutti gli altri (sono lo stesso file fisico)

Limitazioni:

  • Funziona solo all’interno dello stesso filesystem
  • Non utilizzabile tra partizioni o dischi diversi

Symlink relativi

bash
jdupes -r -l /percorso/cartella

L’opzione -l (link-soft) crea symlink relativi per i duplicati. Meno efficiente degli hard link ma funziona anche tra filesystem diversi.

Deduplica con reflink (copy-on-write)

bash
jdupes -r -B /percorso/cartella

L’opzione -B (dedupe) esegue una deduplica copy-on-write usando reflink. Disponibile solo su filesystem moderni che supportano questa funzionalità come:

  • Btrfs
  • XFS (con reflink abilitato)
  • APFS (macOS)

I file condividono i blocchi fisici ma rimangono indipendenti: modificarne uno crea automaticamente una copia separata solo dei blocchi modificati.

Opzioni utili aggiuntive

Escludere file nascosti

bash
jdupes -r -A /percorso/cartella

L’opzione -A (no-hidden) esclude dalla scansione i file e le cartelle che iniziano con punto.

Non attraversare filesystem diversi

bash
jdupes -r -1 /percorso/cartella

L’opzione -1 (one-file-system) limita la scansione al filesystem corrente, senza attraversare mount point verso altre partizioni o dischi.

Considerare i permessi dei file

bash
jdupes -r -p /percorso/cartella

L’opzione -p considera i file come diversi se hanno owner, group o permessi differenti, anche se il contenuto è identico.

Stampare solo file unici

bash
jdupes -r -u /percorso/cartella

L’opzione -u inverte la logica: stampa solo i file che NON hanno duplicati.

Considerare file di dimensione zero come duplicati

bash
jdupes -r -z /percorso/cartella

Di default jdupes ignora i file vuoti (0 byte). L’opzione -z li include come potenziali duplicati.

Esempio pratico completo

Scenario reale: vuoi pulire le cartelle Download e Documenti, mantenendo sempre i file da Documenti e verificando prima cosa verrà eliminato.

Passo 1: Analisi preliminare

bash
jdupes -r -S -M ~/Documenti ~/Download > report_duplicati.txt

Questo comando:

  • Scansiona ricorsivamente entrambe le cartelle
  • Mostra la dimensione di ogni file duplicato
  • Aggiunge un riepilogo finale
  • Salva tutto nel file report_duplicati.txt

Passo 2: Revisione del report

Apri e leggi report_duplicati.txt per verificare:

  • Quali file sono duplicati
  • Quanto spazio puoi recuperare
  • Se ci sono file importanti che vuoi gestire manualmente
bash
less report_duplicati.txt
# oppure
cat report_duplicati.txt

Passo 3: Cancellazione sicura

bash
jdupes -r -d -N -O ~/Documenti ~/Download

Questo comando:

  • Elimina automaticamente i duplicati
  • Mantiene sempre i file da ~/Documenti (specificata prima)
  • Cancella i duplicati da ~/Download

Variante: modalità interattiva per controllo extra

Se preferisci controllare manualmente ogni gruppo:

bash
jdupes -r -d -O ~/Documenti ~/Download

Senza -N il comando chiede conferma per ogni gruppo di duplicati.

Consigli di sicurezza

Backup preventivo

Prima di usare qualsiasi comando di cancellazione automatica (-d -N), fai sempre un backup delle cartelle importanti. jdupes è estremamente affidabile grazie alla verifica byte-per-byte, ma un errore umano nella scelta delle opzioni può causare cancellazioni indesiderate.

Anteprima sempre prima di cancellare

Usa -m o -M per vedere un’anteprima dello spazio recuperabile prima di procedere con la cancellazione:

bash
jdupes -r -m /percorso/cartella

Salva sempre un log

Prima di cancellare, salva l’elenco completo dei duplicati:

bash
jdupes -r -S ~/cartella > duplicati_backup.txt
jdupes -r -d -N ~/cartella

In caso di problemi, hai traccia di cosa è stato eliminato.

Non usare mai -Q con operazioni distruttive

L’opzione -Q (quick) salta la verifica byte-per-byte finale per accelerare la scansione. Non usarla mai insieme a -d, -L, o -B perché aumenta il rischio (seppur minimo) di falsi positivi.

bash
# MAI FARE QUESTO:
jdupes -r -Q -d -N /percorso/cartella # PERICOLOSO!

Usa -O per controllo preciso

Quando elimini duplicati tra più cartelle, usa sempre -O e specifica per prima la cartella con i file che vuoi preservare:

bash
jdupes -r -d -N -O /importante /temporanea

Test su cartella piccola

Se è la prima volta che usi jdupes per cancellare, fai un test su una cartella piccola e non critica per familiarizzare con il comportamento del comando.

Confronto con altri tool

jdupes offre vantaggi significativi rispetto ad alternative come fdupes o rdfind:

  • Velocità superiore: algoritmo ottimizzato e multithreading
  • Più opzioni: supporto per hard link, symlink, reflink, JSON output
  • Verifica completa: confronto byte-per-byte garantito per sicurezza massima
  • Sviluppo attivo: aggiornamenti regolari e correzioni bug

Conclusione

jdupes è uno strumento potente, veloce e sicuro per recuperare spazio su disco eliminando file duplicati su sistemi Linux. Grazie al suo algoritmo multi-stage con verifica byte-per-byte finale, puoi stare tranquillo che non cancellerà mai file diversi per errore.

Le opzioni flessibili permettono di adattare jdupes a qualsiasi scenario: dalla semplice ricerca di duplicati con log dettagliato, alla cancellazione automatica controllata, fino alla deduplica avanzata con hard link o reflink per massimizzare l’efficienza dello storage.

Che tu debba pulire la cartella Download, organizzare un archivio fotografico, o ottimizzare lo spazio su un NAS, jdupes è lo strumento giusto per il lavoro.