Come sostituire tutti i file duplicati con hard link?


20

Ho due cartelle che contengono vari file. Alcuni dei file dalla prima cartella hanno una copia esatta nella seconda cartella. Vorrei sostituire quelli con un collegamento reale. Come posso fare ciò?


2
Fornire sistema operativo e file system.
Steven

Beh, io uso ext4 su Ubuntu 15.04, ma se qualcuno fornisce una risposta per un altro sistema operativo, sono sicuro che può essere utile per qualcuno che legge questa domanda.
QDII

Risposte:


20

So di 4 soluzioni riga di comando per Linux. Il mio preferito è quello l'ultimo elencato qui, rdfind, a causa di tutte le opzioni disponibili.

fdupes

  • Questo sembra essere il più consigliato uno / più noto.
  • È il più semplice da usare, ma l'unica azione è eliminare i duplicati.
  • Per garantire che i duplicati siano in realtà duplicati (anche se non impiegano un'eternità per essere eseguiti), i confronti tra i file vengono effettuati prima per dimensione del file, quindi hash md5, quindi confronto per byte.

Esempio di output (con opzioni "mostra dimensione", "ricorsivo"):

$ fdupes -Sr .
17 bytes each:                          
./Dir1/Some File
./Dir2/SomeFile

hardlink

  • Progettato per, come indica il nome, sostituire i file trovati con hardlink.
  • Ha un --dry-runopzione.
  • Non indica come vengono confrontati i contenuti, ma a differenza di tutte le altre opzioni, tiene conto della modalità file, del proprietario e del tempo modificato.

Output di esempio (nota come i miei due file abbiano tempi di modifica leggermente diversi, quindi nella seconda esecuzione gli dico di ignorarlo):

$ stat Dir*/* | grep Modify
Modify: 2015-09-06 23:51:38.784637949 -0500
Modify: 2015-09-06 23:51:47.488638188 -0500

$ hardlink --dry-run -v .
Mode:     dry-run
Files:    5
Linked:   0 files
Compared: 0 files
Saved:    0 bytes
Duration: 0.00 seconds

$ hardlink --dry-run -v -t .
[DryRun] Linking ./Dir2/SomeFile to ./Dir1/Some File (-17 bytes)
Mode:     dry-run
Files:    5
Linked:   1 files
Compared: 1 files
Saved:    17 bytes
Duration: 0.00 seconds

Duff

  • Fatto per trovare i file che l'utente agisce quindi su; non ha azioni disponibili.
  • I confronti vengono effettuati in base alla dimensione del file, quindi all'hash sha1.
    • Hash può essere cambiato in sha256, sha384 o sha512.
    • L'hash può essere disabilitato per fare un confronto byte per byte

Esempio di output (con opzione "ricorsivo"):

$ duff -r .
2 files in cluster 1 (17 bytes, digest 34e744e5268c613316756c679143890df3675cbb)
./Dir2/SomeFile
./Dir1/Some File

rdfind

  • Le opzioni hanno una sintassi insolita (pensata per imitare find?).
  • Diverse opzioni per le azioni da intraprendere sul file duplicati (eliminare, i collegamenti simbolici make, make collegamenti fisici).
  • Ha una modalità di funzionamento a secco.
  • I confronti sono fatte in base alle dimensioni del file, poi la prima-byte, quindi ultimi byte, allora o md5 (default) o SHA1.
  • La classificazione dei file trovati rende prevedibile quale file è considerato l'originale.

Uscita campione:

$ rdfind -dryrun true -makehardlinks true .
(DRYRUN MODE) Now scanning ".", found 5 files.
(DRYRUN MODE) Now have 5 files in total.
(DRYRUN MODE) Removed 0 files due to nonunique device and inode.
(DRYRUN MODE) Now removing files with zero size from list...removed 0 files
(DRYRUN MODE) Total size is 13341 bytes or 13 kib
(DRYRUN MODE) Now sorting on size:removed 3 files due to unique sizes from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on first bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on last bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on md5 checksum:removed 0 files from list.2 files left.
(DRYRUN MODE) It seems like you have 2 files that are not unique
(DRYRUN MODE) Totally, 17 b can be reduced.
(DRYRUN MODE) Now making results file results.txt
(DRYRUN MODE) Now making hard links.
hardlink ./Dir1/Some File to ./Dir2/SomeFile
Making 1 links.

$ cat results.txt 
# Automatically generated
# duptype id depth size device inode priority name
DUPTYPE_FIRST_OCCURRENCE 1 1 17 2055 24916405 1 ./Dir2/SomeFile
DUPTYPE_WITHIN_SAME_TREE -1 1 17 2055 24916406 1 ./Dir1/Some File
# end of file

1
"allora o md5 (default) o SHA1." Ciò non significa che i file sono identici. Dal momento che il calcolo di un hash richiede il programma per leggere l'intero file in ogni caso, si deve solo confrontare l'intero file di byte per byte. Consente di risparmiare tempo di CPU, anche.
endolith

@endolith Ecco perché si inizia sempre con funzionamento a secco, per vedere cosa sarebbe successo ...
Izkata

1
Ma il punto del software è identificare i file duplicati per te. Se devi ricontrollare manualmente che i file siano effettivamente duplicati, non va bene.
endolith


2
Se si dispone di n file con dimensioni identiche, primi-byte, e finali byte, ma sono tutti diversi altrimenti, stabilendo che per confronto diretto richiede n ! confronti a coppie. Hashing loro tutti gli hash quindi confrontando è probabile che sia molto più veloce, soprattutto per i file di grandi dimensioni e / o gran numero di file. Chiunque passi quel filtro può continuare a fare confronti diretti per verificarlo. (O semplicemente usa un hash migliore per iniziare.)
Alan De Smet

6

Duplicate Commander è una possibile soluzione su Windows:

Duplicate Commander è un'applicazione freeware che consente di trovare e gestire i file duplicati sul proprio PC. Duplicate Commander è dotato di molte funzioni e strumenti che consentono di recuperare spazio su disco da quei duplicati.

Caratteristiche:

Replacing files with hard links
Replacing files with soft links
... (and many more) ...

1

Per Linux puoi trovare uno script Bash qui .


2

Duplicate & Same File Searcher è ancora un'altra soluzione su Windows:

Duplicate & Same Files Searcher (Duplica Searcher) è un'applicazione per la ricerca di file duplicati (cloni) e hard link NTFS per lo stesso file. Si cerca il contenuto dei file duplicati indipendentemente dal nome del file (vero confronto byte per byte è utilizzato). Questa applicazione permette non solo di eliminare i file duplicati o spostarli in un'altra posizione, ma per sostituire i duplicati con hard link NTFS, nonché (unico!)

inserisci qui la descrizione dell'immagine


1

Avevo un grazioso strumento gratuito sul mio computer chiamato Link Shell Extension; non solo è stato fantastico per la creazione di collegamenti reali e collegamenti simbolici, ma anche di giunzioni! Inoltre, ha aggiunto icone personalizzate che consentono di identificare facilmente diversi tipi di collegamenti, anche quelli già esistenti prima dell'installazione; Le frecce rosse rappresentano i collegamenti reali, ad esempio, mentre il verde rappresenta i collegamenti simbolici ... e le catene rappresentano le giunzioni.

Io purtroppo disinstallato il software un po 'indietro (in una massa-disinstallazione dei vari programmi), quindi non posso creare più collegamenti manualmente, ma le icone mostrano ancora automaticamente ogni volta che Windows rileva un, hard link simbolico o Junction.


1

Consiglio vivamente jdupes . È un maggiore forcella di fdupes , ma comprende anche:

  • una serie di nuove opzioni della riga di comando - tra cui --linkhard, o -Lin breve
  • supporto nativo per tutte le principali piattaforme OS
  • Velocità detto di essere più di 7 volte più veloce di fdupes in media

Per la vostra domanda, si può solo eseguire $ jdupes -L /path/to/your/files.

Si consiglia di clonare e costruire l'ultima fonte dalla sua repo GitHub dal momento che il progetto è ancora in fase di sviluppo attivo. Binari di Windows sono anche previste qui. Confezionato binari sono disponibili in alcune distribuzioni Linux / BSD - in realtà ho scoperto attraverso $ apt search.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.