Szukam łatwego sposobu (polecenia lub serii poleceń, prawdopodobnie obejmujących find
), aby znaleźć duplikaty plików w dwóch katalogach i zastąpić je w jednym katalogu twardymi dowiązaniami plików w drugim katalogu.
Oto sytuacja: jest to serwer plików, na którym wiele osób przechowuje pliki audio, każdy użytkownik ma własny folder. Czasami wiele osób ma kopie dokładnie tych samych plików audio. W tej chwili są to duplikaty. Chciałbym, żeby były twardymi linkami, aby zaoszczędzić miejsce na dysku twardym.
Odpowiedzi:
Na stronie http://cpansearch.perl.org/src/ANDK/Perl-Repository-APC-2.002/eg/trimtrees.pl znajduje się skrypt perla, który robi dokładnie to, co chcesz:
źródło
rdfind
jest dostępny za pośrednictwem menedżerów pakietów dla WSZYSTKICH głównych platform (os x, linux, (cyg) win, solaris) i działa z niesamowitą natywną prędkością. Sprawdź więc odpowiedź poniżej.[Errno 31] Too many links
. Te skrypty wydają się być jedyną rzeczą, która sobie z tym radzi.rdfind
robi dokładnie to, o co prosisz (w kolejności, dlaczego listy). Umożliwia usuwanie duplikatów, zastępowanie ich miękkimi lub twardymi linkami. W połączeniu zsymlinks
tobą możesz również uczynić dowiązanie symboliczne absolutnym lub względnym. Możesz nawet wybrać algorytm sumy kontrolnej (md5 lub sha1).Ponieważ jest skompilowany, jest szybszy niż większość rozwiązań skryptowych:
time
w folderze 15 GiB z 2600 plikami na moim Macu Mini od 2009 roku zwraca to(przy użyciu md5).
Dostępne w większości programów obsługi pakietów (np. MacPorts dla Mac OS X).
źródło
rdfind
i pokochałem to. Ma-dryrun true
opcję, która da ci znać, co by zrobił. Zastąpienie duplikatów twardymi linkami jest tak proste, jak-makehardlinks true
. Stworzyło fajny dziennik i dało mi znać, ile miejsca zostało zwolnione. Ponadto, zgodnie z testem autora , rdfind jest szybszy niż duff i fslint.Użyj
fdupes
narzędzia:fdupes -r /path/to/folder
daje listę duplikatów w katalogu (-r sprawia, że jest rekurencyjna). Dane wyjściowe wyglądają następująco:nazwa_pliku1
nazwa_pliku2
nazwa_pliku3
nazwa_pliku4
nazwa_pliku5
przy czym nazwa_1 i nazwa_2 są identyczne, a nazwa_3, nazwa_4 i nazwa_5 również są identyczne.
źródło
rdfind
- jakfdupes
, ale szybciej i dostępny również w OS X i Cygwin.fdupes
wydaje się znajdować tylko duplikaty, a nie zastępować je twardymi linkami, więc nie jest odpowiedzią na pytanie IMO.jdupes
bazujące nafdupes
, ale może również zastąpić zduplikowane pliki symbolami symlinks (-l
), hardlinks (-L
) lub poinstruować btrfs, aby zduplikował bloki na poziomie systemu plików (-B
jeśli używasz btrfs).Korzystam
hardlink
z http://jak-linux.org/projects/hardlink/źródło
hardlink
na Fedorze / RHEL / etc.hardlink
jest teraz natywnym plikiem binarnym w wielu systemach pakietów Linuksa (od ~ 2014) i niezwykle szybki. W przypadku plików 1,2 mln (320 GB) zajęło to tylko 200 sekund (łączenie około 10% plików).hardlink
zostało stworzone przez Juliana Andresa Klode, natomiast Fedoręhardlink
stworzył Jakub Jelinek (źródło: pagure.io/hardlink - nazwa pakietu Fedory : hardlink )Jest to jedna z funkcji udostępnianych przez „fslint” - http://en.flossmanuals.net/FSlint/Introduction
Kliknij przycisk „Scal”:
źródło
sudo apt-get install fslint
/usr/share/fslint/fslint/findup -m /your/directory/tree
(katalog / usr / share / fslint / fslint / domyślnie nie znajduje się w $ PATH)Ponieważ twoim głównym celem jest oszczędzanie miejsca na dysku, istnieje inne rozwiązanie: usuwanie duplikacji (i prawdopodobnie kompresja) na poziomie systemu plików. W porównaniu z rozwiązaniem z twardym łączem nie ma problemu nieumyślnego wpływu na inne połączone pliki.
ZFS ma deduplikację (na poziomie bloku, nie na poziomie pliku) od wersji puli 23 i kompresję od dawna. Jeśli używasz Linuksa, możesz spróbować zfs-fuse lub jeśli używasz BSD, jest on natywnie obsługiwany.
źródło
btrfs
używa deduplikacji wsadowej lub offline (uruchamiaj ją, gdy uznasz to za przydatne / konieczne) btrfs.wiki.kernel.org/index.php/Deduplicationrsync --inplace
tylko zmienionych bloków)Na współczesnym Linuksie znajduje się https://github.com/g2p/bedup, który usuwa duplikaty w systemie plików btrfs, ale 1) bez tak dużego nakładu skanowania, 2) pliki mogą później łatwo się rozbierać.
źródło
cp --reflink
, patrz także poniżej)Aby znaleźć duplikaty plików, możesz użyć duff .
Po prostu uruchom:
Aby automatycznie utworzyć dowiązania twarde do tych plików, musisz przeanalizować dane wyjściowe duff za pomocą bash lub innego języka skryptowego.
źródło
Opis: Twarde linki łączy wiele kopii tego samego pliku Hardlink to narzędzie, które wykrywa wiele kopii tego samego pliku i zastępuje je twardymi linkami.
Pomysł został zaczerpnięty z http://code.google.com/p/hardlinkpy/ , ale kod został napisany od zera i licencjonowany na licencji MIT. Strona internetowa: http://jak-linux.org/projects/hardlink/
źródło
Użyłem wielu narzędzi linkujących na twardo do Linuksa wymienionych tutaj. Ja też utknąłem z ext4 fs na Ubuntu i używałem jego cp -l i -s do twardego / miękkiego linkowania. Ale ostatnio zauważyłem lekką kopię strony podręcznika cp , co oznaczałoby oszczędność nadmiarowego miejsca na dysku, dopóki jedna strona nie zostanie zmodyfikowana:
źródło
cp
alias, aby zawsze zawierał--reflink=auto
parametr teraz--reflink
?Wydaje mi się, że najpierw sprawdzenie nazwy pliku może przyspieszyć. Jeśli w dwóch plikach brakuje tej samej nazwy pliku, w wielu przypadkach nie uważałbym ich za duplikaty. Wydaje się, że najszybszą metodą byłoby porównanie w celu:
Czy jakieś metody to robią? Spójrz na
duff
,fdupes
,rmlint
,fslint
, itd.Następująca metoda została najczęściej głosowana w Commandlinefu.com : Znajdź zduplikowane pliki (najpierw na podstawie rozmiaru, a następnie skrótu MD5)
Czy porównanie nazw plików można dodać jako pierwszy krok, a rozmiar jako drugi krok?
źródło
duff
,fdupes
irmlint
, i zdecydowanie polecam czytelnikom spojrzeć na trzeciej z nich . Ma doskonały zestaw opcji (i dokumentację). Dzięki temu mogłem uniknąć dużej ilości post-processingu, którego musiałem używać z innymi narzędziami.install.sh
plików można znaleźć w aktywnym systemie? Nie mogę policzyć, ile razy zapisałem plik i miałem konflikt nazw, z pewną zmianą nazwy w locie, aby go zapisać. Odwrotna strona: nie mam pojęcia, ile razy pobrałem coś z różnych źródeł w różnych dniach, ale okazało się, że to ten sam plik o różnych nazwach. (Co również zabija niezawodność znaczników czasu.) 1: Rozmiar, 2: Podsumowanie, 3: Zawartość bajtu.Ponieważ nie jestem fanem Perla, oto wersja bash:
Znajduje wszystkie pliki z tą samą sumą kontrolną (niezależnie od tego, czy są to duże, małe, czy już twarde łącza) i łączy je razem.
Można to znacznie zoptymalizować pod kątem powtarzanych przebiegów z dodatkowymi flagami find (np. Rozmiar) i pamięcią podręczną plików (dzięki czemu nie trzeba za każdym razem powtarzać sum kontrolnych). Jeśli ktoś jest zainteresowany mądrzejszą, dłuższą wersją, mogę ją opublikować.
UWAGA: Jak już wspomniano wcześniej, dowiązania twarde działają tak długo, jak długo pliki nie wymagają modyfikacji lub są przenoszone między systemami plików.
źródło
rdfind
, który działa przy prędkościach rodzimych i wymaga tylkobrew install rdfind
czyapt-get install rdfind
aby zainstalowane.Stworzyłem skrypt Perla, który robi coś podobnego do tego, o czym mówisz:
http://pastebin.com/U7mFHZU7
Zasadniczo, po prostu przegląda katalog, obliczając sumę SHA1 zawartych w nim plików, mieszając go i łącząc ze sobą dopasowania. Przydaje się przy wielu, wielu okazjach.
źródło
Jeśli chcesz zastąpić duplikaty Hard Links na Macu lub dowolnym systemie opartym na UNIX, możesz wypróbować SmartDupe http://sourceforge.net/projects/smartdupe/ .
źródło
Aplikacje FSLint ( http://www.pixelbeat.org/fslint/ ) mogą znajdować wszystkie równe pliki w dowolnym folderze (według zawartości) i tworzyć dowiązania twarde. Spróbuj!
Jorge Sampaio
źródło
jdupes
został wspomniany w komentarzu, ale zasługuje na własną odpowiedź, ponieważ prawdopodobnie jest dostępny w większości dystrybucji i działa dość szybko (po prostu uwolnił 2,7 GB z 98% pełnej partycji 158 GB (dysk SSD) w ciągu około minuty):źródło
Jeśli będziesz robił twarde linki, zwróć uwagę na prawa do tego pliku. Informacja, właściciel, grupa, tryb, rozszerzone atrybuty, czas i lista ACL (jeśli go używasz) są przechowywane w INODE. Różne są tylko nazwy plików, ponieważ są one przechowywane w strukturze katalogów, a inne wskazują na właściwości INODE. To powoduje, że wszystkie nazwy plików powiązane z tym samym i-węzłem mają takie same prawa dostępu. Powinieneś zapobiec modyfikacji tego pliku, ponieważ każdy użytkownik może uszkodzić plik na innym. To jest proste. Wystarczy, że każdy użytkownik umieści inny plik pod tą samą nazwą. Numer i-węzła jest następnie zapisywany, a oryginalna zawartość pliku jest niszczona (zastępowana) dla wszystkich nazw podlinkowanych.
Lepszym sposobem jest deduplikacja na warstwie systemu plików. Możesz użyć BTRFS (ostatnio bardzo popularny), OCFS lub podobnego. Spójrz na stronę: https://en.wikipedia.org/wiki/Comparison_of_file_systems , szczególnie w tabeli Funkcje i deduplikacja danych w kolumnie. Możesz kliknąć i posortować :)
Spójrz szczególnie na system plików ZFS. Jest dostępny jako BEZPIECZNIK, ale w ten sposób działa bardzo wolno. Jeśli potrzebujesz natywnego wsparcia, zajrzyj na stronę http://zfsonlinux.org/ . Następnie musisz załatać jądro, a następnie zainstalować narzędzia ZFS do zarządzania. Nie rozumiem, dlaczego Linux nie obsługuje sterowników, jest to droga dla wielu innych systemów operacyjnych / jąder.
Systemy plików obsługują deduplikację na dwa sposoby, deduplikują pliki lub bloki. ZFS obsługuje blok. Oznacza to, że tę samą treść, która powtarza się w tym samym pliku, można deduplikować. Innym sposobem jest czas deduplikacji danych, może to być tryb online (zfs) lub offline (btrfs).
Zauważ, że deduplikacja zużywa pamięć RAM. Dlatego zapisywanie plików na woluminie ZFS zamontowanym za pomocą FUSE powoduje dramatycznie niską wydajność. Jest to opisane w dokumentacji. Ale możesz ustawić online włączanie / wyłączanie deduplikacji na poziomie głośności. Jeśli zauważysz, że jakieś dane powinny zostać deduplikowane, po prostu włącz deduplikację, przepisz jakiś plik do dowolnego pliku tymczasowego i ostatecznie zastąp. po tym możesz wyłączyć deduplikację i przywrócić pełną wydajność. Oczywiście do pamięci można dodać dowolne dyski pamięci podręcznej. Mogą to być bardzo szybkie dyski obrotowe lub dyski SSD. Oczywiście mogą to być bardzo małe dyski. W prawdziwej pracy jest to zamiennik pamięci RAM :)
Pod Linuksem powinieneś zadbać o ZFS, ponieważ nie wszystkie działają tak, jak powinny, szczególnie gdy zarządzasz systemem plików, tworzysz migawki itp., Ale jeśli wykonujesz konfigurację i nie zmieniasz jej, wszystko działa poprawnie. Innym sposobem jest zmiana Linuksa na opensolaris, natywnie obsługuje on ZFS :) To, co jest bardzo miłe w ZFS, działa zarówno jako system plików, jak i menedżer wolumenów podobny do LVM. Nie potrzebujesz go podczas korzystania z ZFS. Zobacz dokumentację, jeśli chcesz dowiedzieć się więcej.
Zwróć uwagę na różnicę między ZFS i BTRFS. ZFS jest starszy i bardziej dojrzały, niestety tylko pod Solaris i OpenSolaris (niestety uduszony przez oracle). BTRFS jest młodszy, ale ostatnio bardzo dobrze obsługiwany. Polecam świeże jądro. ZFS ma deduplikację online, która powoduje spowolnienie zapisu, ponieważ wszystko jest obliczane online. BTRFS obsługuje dedupliakcję off-line. Następnie oszczędza to wydajność, ale gdy host nie ma nic do roboty, od czasu do czasu uruchamiasz narzędzie do wykonywania deduplikacji. A BTRFS jest natywnie tworzony pod Linuksem. Może to dla ciebie lepszy FS :)
źródło
btrfs
. Doskonałe omówienie opcji (w tymcp --reflink
opcji) tutaj: btrfs.wiki.kernel.org/index.php/DeduplicationTwarde linki mogą nie być najlepszym pomysłem; jeśli jeden użytkownik zmieni plik, wpływa to na oba. Jednak usunięcie twardego łącza nie powoduje usunięcia obu plików. Ponadto nie jestem całkowicie pewien, czy twarde łącza zajmują tyle samo miejsca (na dysku twardym, a nie w systemie operacyjnym), jak wiele kopii tego samego pliku; zgodnie z systemem Windows (z rozszerzeniem Link Shell) robią to. To prawda, że to Windows, a nie Unix ...
Moim rozwiązaniem byłoby utworzenie „wspólnego” pliku w ukrytym folderze i zastąpienie rzeczywistych duplikatów dowiązaniami symbolicznymi ... wtedy dowiązania symboliczne zostałyby osadzone z metadanymi lub alternatywnymi strumieniami plików, które rejestrowałyby jednak tylko dwa „pliki” różnią się od siebie, na przykład jeśli jedna osoba chce zmienić nazwę pliku lub dodać niestandardową okładkę albumu lub coś podobnego; może nawet być przydatny poza aplikacjami bazodanowymi, np. instalując wiele wersji tej samej gry lub oprogramowania i testując je niezależnie, nawet przy najmniejszych różnicach.
źródło
Najłatwiejszym sposobem jest użycie specjalnego programu dupeGuru
jak mówi dokumentacja
źródło