Jak zastąpić wszystkie zduplikowane pliki twardymi linkami?

20

Mam dwa foldery zawierające różne pliki. Niektóre pliki z pierwszego folderu mają dokładną kopię w drugim folderze. Chciałbym zastąpić je twardym linkiem. Jak mogę to zrobić?

qdii
źródło
2
Podaj system operacyjny i system plików.
Steven
Cóż, używam ext4 na Ubuntu 15.04, ale jeśli ktoś udzieli odpowiedzi na inny system operacyjny, jestem pewien, że może być pomocny dla kogoś, kto czyta to pytanie.
qdii

Odpowiedzi:

20

Znam 4 rozwiązania wiersza polecenia dla systemu Linux. Mój preferowany jest ostatni wymieniony tutaj rdfind, ze względu na wszystkie dostępne opcje.

fdupes

  • To wydaje się być najbardziej zalecane / najbardziej znane.
  • Jest najprostszy w użyciu, ale jego jedyną czynnością jest usuwanie duplikatów.
  • Aby upewnić się, że duplikaty są w rzeczywistości duplikatami (choć nie trwają wiecznie), porównania między plikami są wykonywane najpierw według rozmiaru pliku, następnie skrótu md5, a następnie porównania bajt po bajcie.

Przykładowe dane wyjściowe (z opcjami „pokaż rozmiar”, „rekurencyjny”):

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

hardlink

  • Zaprojektowany, aby, jak sama nazwa wskazuje, zastąpić znalezione pliki linkami twardymi.
  • Ma --dry-runopcję.
  • Nie wskazuje, jak porównywana jest zawartość, ale w przeciwieństwie do wszystkich innych opcji, bierze pod uwagę tryb pliku, właściciela i zmodyfikowany czas.

Przykładowe dane wyjściowe (zwróć uwagę, że moje dwa pliki mają nieco inne czasy modyfikacji, więc w drugim uruchomieniu mówię, aby to zignorować):

$ 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

lipny

  • Stworzony, aby znaleźć pliki, na które użytkownik następnie działa; nie ma dostępnych akcji.
  • Porównania są wykonywane według rozmiaru pliku, a następnie skrótu sha1.
    • Hash można zmienić na sha256, sha384 lub sha512.
    • Hash można wyłączyć, aby porównać bajt po bajcie

Przykładowe dane wyjściowe (z opcją „rekurencyjne”):

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

rdfind

  • Opcje mają nietypową składnię (przeznaczoną do naśladowania find ?).
  • Kilka opcji działań na duplikatach plików (usuwanie, tworzenie dowiązań symbolicznych, tworzenie dowiązań twardych).
  • Ma tryb pracy na sucho.
  • Porównania są wykonywane według rozmiaru pliku, następnie najpierw bajtów, następnie ostatnich bajtów, a następnie albo md5 (domyślnie), albo sha1.
  • Ranking znalezionych plików pozwala przewidzieć, który plik jest uważany za oryginalny.

Przykładowe dane wyjściowe:

$ 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
Izkata
źródło
1
„następnie albo md5 (domyślnie) lub sha1.” To nie znaczy, że pliki są identyczne. Ponieważ obliczenie skrótu wymaga od programu odczytania całego pliku, powinno ono po prostu porównać wszystkie pliki bajt po bajcie. Oszczędza również czas procesora.
endolith
@endolith Dlatego zawsze zaczynasz od biegu na sucho, aby zobaczyć, co się stanie ...
Izkata
1
Ale celem oprogramowania jest identyfikacja zduplikowanych plików. Jeśli musisz ręcznie dwukrotnie sprawdzić, czy pliki są faktycznie duplikatami, nie jest to dobre.
endolith,
2
Jeśli masz n plików o identycznym rozmiarze, bajtach pierwszych i końcowych, ale wszystkie one są inaczej różne, ustalenie, że przez bezpośrednie porównanie wymaga n ! porównania par. Hashowanie ich wszystkich, a następnie porównywanie skrótów prawdopodobnie będzie znacznie szybsze, szczególnie w przypadku dużych plików i / lub dużej liczby plików. Każdy, który przejdzie przez ten filtr, może przejść do bezpośrednich porównań w celu weryfikacji. (Lub po prostu użyj lepszego skrótu, aby rozpocząć.)
Alan De Smet
6

Duplicate Commander to możliwe rozwiązanie w systemie Windows:

Duplicate Commander to darmowa aplikacja, która umożliwia znajdowanie i zarządzanie zduplikowanymi plikami na komputerze. Duplicate Commander zawiera wiele funkcji i narzędzi, które pozwalają odzyskać miejsce na dysku z tych duplikatów.

Cechy:

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

1

W przypadku systemu Linux skrypt Bash można znaleźć tutaj .

Karan
źródło
2

Wyszukiwarka duplikatów i samych plików to kolejne rozwiązanie w systemie Windows:

Wyszukiwarka duplikatów i samych plików (Wyszukiwarka duplikatów) to aplikacja do wyszukiwania duplikatów plików (klonów) i twardych łączy NTFS do tego samego pliku. Przeszukuje zduplikowaną zawartość pliku bez względu na nazwę pliku (używane jest prawdziwe porównanie bajtów do bajtów). Ta aplikacja pozwala nie tylko usuwać duplikaty plików lub przenosić je w inne miejsce, ale także zastępować duplikaty twardymi linkami NTFS (unikalne!)

wprowadź opis zdjęcia tutaj

Greck
źródło
1

Na swoim komputerze miałem fajne darmowe narzędzie o nazwie Link Shell Extension; nie tylko świetnie nadawał się do tworzenia twardych i symbolicznych linków, ale także połączeń! Ponadto dodano niestandardowe ikony, które pozwalają łatwo zidentyfikować różne typy łączy, nawet te, które istniały już przed instalacją; Czerwone strzałki reprezentują na przykład twarde linki, podczas gdy zielone reprezentują dowiązania symboliczne ... a łańcuchy oznaczają skrzyżowania.

Niestety odinstalowałem oprogramowanie jakiś czas temu (podczas masowej dezinstalacji różnych programów), więc nie mogę już ręcznie tworzyć linków, ale ikony nadal pojawiają się automatycznie, gdy Windows wykryje łącze Hard, Symbolic lub Junction.

Amaroq Starwind
źródło
1

Bardzo polecam jdupes . Jest to ulepszony widelec Fdupes , ale zawiera również:

  • kilka nowych opcji wiersza polecenia - w tym --linkhardlub-L w skrócie
  • natywne wsparcie dla wszystkich głównych platform systemu operacyjnego
  • średnia prędkość jest ponad 7 razy większa niż w przypadku fdupes

Na swoje pytanie możesz po prostu wykonać $ jdupes -L /path/to/your/files .

Możesz sklonować i zbudować najnowsze źródło z repozytorium GitHub, ponieważ projekt jest nadal w fazie aktywnego rozwoju. Pliki binarne systemu Windows są również dostępne tutaj. Pakiety binarne są dostępne w niektórych dystrybucjach Linux / BSD - tak naprawdę to po raz pierwszy to znalazłem $ apt search.

Arnie97
źródło