Prima o poi il disco si riempie, e quando succede c’è sempre la stessa domanda: dove sono finiti tutti questi gigabyte? Spesso la risposta è banale: file copiati due, tre, dieci volte, in cartelle diverse, magari anni fa. Oggi vediamo fdupes, lo strumento che cerca per noi i file duplicati in giro per il file system.
Installazione
Come sempre si parte dall’installazione. Su Debian, Ubuntu e derivate:
sudo apt install fdupes
L’uso più semplice
Nella sua forma base fdupes vuole come input il nome di una cartella. Da solo, però, guarda soltanto i file dentro quella cartella e non le sottocartelle, quindi di solito non è molto utile. Il minimo indispensabile è l’opzione -r, che indica la ricorsione:
fdupes -r cartella
Per capire se due file sono davvero uguali fdupes usa una combinazione di strategie: prima confronta le dimensioni, poi calcola l’MD5, infine fa un controllo byte per byte. Quindi niente falsi positivi: se li elenca come doppi, sono doppi.
L’output è semplicemente un elenco di gruppi di file identici, con una riga vuota fra un gruppo e l’altro. Funziona, ma non ci dice quanto spazio occupano, e se il nostro obiettivo è liberare spazio non sappiamo da dove cominciare.
Le opzioni che servono davvero
- -S mostra la dimensione dei file duplicati. È l’opzione che consiglio di usare sempre, perché ci dice dove si nasconde lo spreco.
- -A esclude i file e le cartelle nascosti. Le cartelle come .git contengono un sacco di file identici che però sono falsi positivi: devono stare lì, e cancellarli sarebbe un disastro. Escluderli dall’indagine rende anche la ricerca più veloce.
Mettendo tutto insieme, la riga di comando diventa:
fdupes -r -S -A cartella
Notate la S e la A maiuscole. Ora l’elenco comprende la dimensione di ogni gruppo, e i file nascosti non ci sono. L’output è qualcosa del genere:
5242880 bytes each:
./vecchi/film.bin
./backup/film-copia.bin
1024 bytes each:
./appunti/note.txt
./appunti/note-2.txt
Ordinare i duplicati per dimensione
Quando i file sono tanti, l’elenco non è ordinato in nessun modo, e a noi interessano prima di tutto i gruppi più grossi. Possiamo combinare fdupes con altri strumenti: ogni gruppo deve finire su una sola riga, con la dimensione all’inizio, così poi lo ordiniamo con sort. Per questo ci serve un vecchio amico, awk (se non avete visto la puntata dedicata, recuperatela: qui la riga è compatta e non la spiego tutta).
Prima salviamo l’output di fdupes in un file e guardiamolo:
fdupes -r -S -A cartella > lista.txt
Ogni gruppo comincia con la dichiarazione della dimensione ed è separato dal successivo da una riga vuota. Quindi possiamo scrivere un programma awk che sostituisce il carattere di fine riga solo quando la riga non è vuota: così tutti i membri di un gruppo restano sulla stessa riga. Poi passiamo il risultato a sort con l’opzione -h, che ordina i numeri come li leggerebbe un umano (senza -h l’ordine sarebbe strettamente alfabetico) e riscriviamo tutto su un file:
awk 'ORS=NF?"\0":RT"\n"' lista.txt | sort -h > ordinata.txt
Attenzione: la variabile RT esiste in gawk, la versione GNU di awk. Se sul vostro sistema awk è mawk, installate gawk.
Fra i membri di ogni gruppo awk mette un carattere nullo, che a video non si vede e rende l’output un po’ compresso. Per leggerlo meglio trasformiamolo in uno spazio:
tr '\0' ' ' < ordinata.txt
In fondo ci sono i gruppi più grandi, e l’ultimo è proprio il gigante. Si può anche saltare il file intermedio e usare una pipe diretta (con 2>/dev/null per nascondere l’indicatore di avanzamento che fdupes scrive sullo stderr):
fdupes -r -S -A cartella 2>/dev/null | awk 'ORS=NF?"\0":RT"\n"' \
| sort -h | tr '\0' ' '
Cancellare i duplicati
A questo punto possiamo processare la lista per conto nostro, partendo dai file più grandi: se non volete cancellare ma spostare i duplicati da qualche altra parte, è il modo giusto di lavorare.
Chi invece vuole cancellare direttamente può chiedere a fdupes di farlo, con l’opzione -d. Per ogni gruppo vi chiede quali copie conservare. Con l’opzione -N (noprompt) non chiede niente e conserva il primo file di ogni gruppo, cancellando gli altri:
fdupes -r -A -d cartella
fdupes -r -A -d -N cartella
Usate -N con molta prudenza: prima guardate l’elenco, poi cancellate. Tutte le altre opzioni di cancellazione sono nella man page.
Conclusione
Un altro attrezzo per la cassetta degli attrezzi del sistemista: fdupes trova i doppioni in modo affidabile, -S ci dice dove intervenire, -A evita i falsi positivi, e con un po’ di awk e sort otteniamo una classifica dei duplicati dal più ingombrante. Provatelo sul vostro disco: scommetto che qualche gigabyte salta fuori.
Link e risorse
- il video su YouTube
- esempi e comandi della puntata su GitHub
- fdupes(1) — la man page
- fdupes su GitHub — il codice e il README
Sostieni il canale
PER SOSTENERE IL CANALE BASTANO UN LIKE E UN’ISCRIZIONE!
ma se vuoi offrirmi un caffè, mi aiuterà a rimanere sveglio mentre registro i video 😁☕
clicca qui per scoprire come https://buymeacoffee.com/thelinuxnerd
questi link sono affiliati Amazon, acquistando i libri che ti consiglio sostieni il canale!
