Ostatnio muszę usunąć wiele duplikatów. Łączę trzy lub cztery systemy plików i chcę, aby przestrzeń była wykorzystywana ekonomicznie. Na początku fdupes
wydawało się , że jest to najlepsze narzędzie do pracy, ale coraz częściej napotykam ograniczenia.
Rozważ polecenie fdupes -rdN somedirectory/
. To tworzy skrót wszystkich plików w podkatalogach somedirectory.
A kiedy napotyka duplikaty, usuwa je, tak że istnieje tylko jedna kopia wszystkiego.
Ale co, jeśli chcę zachować, somedirectory/subdirectory1/somefile
a w rzeczywistości są cztery duplikaty, a program najpierw napotka jeden z nich? Następnie usuwa somedirectory/subdirectory1/somefile
, czego nie chcę.
Chcę móc w jakiś sposób określić, które duplikaty zachować. Jak dotąd żaden ze standardowych programów do radzenia sobie z duplikatami (duff, FSLint) nie pozwala na automatyzację tego rodzaju zachowań. Wolałbym nie toczyć własnego, dlatego zadaję to pytanie.
Chciałbym móc coś napisać
killdupes -rdN --keep=filesin,somedirectories,separated,by,commas somedirectory/
źródło
Odpowiedzi:
Chociaż szukana funkcjonalność nie jest dostępna w magazynie
fdupes
, rozwidliłemfdupes
(nazywa się mój widelecjdupes
) i dodałem pewne funkcje, które mogą rozwiązać ten problem w pewnych okolicznościach. Na przykład w podanym przypadku, gdy chcesz zachowaćsomedirectory/subdirectory1/somefile
podczas automatycznego usuwania duplikatów (d
iN
przełącza się razem) i nie ma osobnych plików bezpośrednio pod nimisomedirectory
,jdupes
można podaćsubdirectory1
pierwszą ścieżkę podkatalogu za pomocą pierwszego i-O
przełącznika (który sortuje pliki według polecenia -pierwsza kolejność parametrów):jdupes -nrdNO somedirectory/subdirectory1 somedirectory/subdirectory2 somedirectory/subdirectory3
Spowoduje to automatyczne usunięcie wszystkich plików oprócz jednego w zduplikowanym zestawie i zagwarantuje, że jeśli zestaw zawiera plik
somedirectory/subdirectory1
, będzie to pierwszy plik, tym samym automatycznie stanie się zachowanym plikiem w zestawie. Nadal istnieją rażące ograniczenia tego podejścia, takie jak fakt,somedirectory/subdirectory1
że można zachować inny duplikat zamiast tego, który chciałbyś zachować, ale w wielu przypadkach, takich jak Twoja,jdupes
opcja porządkowania parametrów jako obejście jest wystarczająca.W najbliższej przyszłości planuję dodać do
jdupes
tego system filtrowania, który umożliwi ogromną kontrolę nad włączaniem / wykluczaniem plików, zachowaniem-N
działań i stosowaniem takich „stosów filtrów” na poziomie globalnym lub na parametr. Ta funkcja jest bardzo potrzebna; Wyobrażam sobie coś takiego w celu „automatycznego usuwania niezerowych duplikatów rekurencyjnie, ALE zawsze zachowujsomedirectory/subdirectory1/somefile
jak jest”:jdupes -nrdN --filter=preserve:somedirectory/subdirectory1/somefile somedirectory/
źródło
Co powiesz na łączenie zduplikowanych plików razem? W ten sposób przestrzeń jest wykorzystywana tylko raz, ale nadal istnieją na wszystkich ścieżkach. Problem polega na tym, że pliki dowiązane do sieci powinny być modyfikowane na miejscu (powinny być modyfikowane tylko poprzez usunięcie pliku i odtworzenie go z nową zawartością). Drugim podejściem jest łączenie plików razem, chociaż masz ten sam problem przy podejmowaniu decyzji, który plik „podstawowy” jest. Można to zrobić za pomocą następującego skryptu (chociaż należy pamiętać, że nie obsługuje to nazw plików zawierających spacje).
źródło
jdupes
zamiastfdupes
ciebie może po prostu iść,jdupes -nrL somedirectory/
co jest znacznie szybsze.Nigdzie indziej nie widziałem: Powiedz, co chcesz. Masz / mnt / folder-drzewo-1 / mnt / folder-drzewo-2. Nie chcesz usuwać każdego duplikatu, ale jeśli plik istnieje w drzewie-2, a identyczny plik istnieje w drzewie-1 o dokładnie tej samej ścieżce i nazwie, usuń go z drzewa-2.
Ostrzeżenie: to dość zwięzłe i jeśli spróbujesz skopiować i wkleić to z ograniczonymi umiejętnościami powłoki, bądź ostrożny.
Lub wszystkie w jednej linii:
Następnie sprawdź i uruchom plik rm-v2-dupes.sh
źródło
Miałem to samo pytanie. Jeśli masz wiele duplikatów,
fdupes /my/directory/ -rdN
zachowuje plik z najstarszą datą modyfikacji lub jeśli kilka plików ma tę samą datę modyfikacji, to ten znaleziony jako pierwszy.Jeśli data modyfikacji nie jest dla Ciebie ważna, możesz
touch
pliki w katalogu, który chcesz zachować. Jeśli wybierzesztouch
je z bieżącą datą i godzinąfdupes -rdNi
, zachowaj te z bieżącą datą. Możesztouch
też przechowywać pliki z datą wcześniejszą niż data, którą chcesz usunąć i używaćfdupes -rdN
jak zwykle.Jeśli musisz zachować datę modyfikacji, musisz użyć jednej z pozostałych metod.
źródło
Wystarczy dodać zwrot do poprzedniej odpowiedzi. Użyłem następującego kodu wiele razy, nieznacznie modyfikując poprzednią odpowiedź, w prosty
| grep
sposób izolując folder, z którego chcę usunąć.Ponownie utworzy to plik sh, aby usunąć wszystkie wymienione pliki bez wierszy z komentarzem. Oczywiście nadal możesz edytować plik, aby skomentować określone linie / pliki, które chcesz zachować.
Inną wskazówką dla dużych katalogów jest uruchomienie fdupes do pliku txt, a następnie eksperymentowanie z
| grep
i| sed
dopóki nie uzyskam pożądanego rezultatu.źródło
Użyj,
sed
aby utworzyć plik powłoki, który będzie zawierał komentowane komentarze, aby usunąć każdy ze zduplikowanych plików:Plik wynikowy
remove-duplicate-files.sh
, który właśnie utworzyliśmy, zostanie opatrzony komentarzem do każdego wiersza. Usuń komentarz z plików, które chcesz usunąć. Potem biegnijsh remove-duplicate-files.sh
. Voila!AKTUALIZACJA
Cóż, jeśli nie chcesz usuwać plików tylko w niektórych katalogach, jest to tak proste :
Gdzie
exclude_duplicates.py
jest:W
remove-duplicate-files-keep-protected.sh
utworzonym pliku, który właśnie utworzyliśmy, wszystkie pliki z chronionych katalogów zostaną skomentowane. Otwórz ten plik w swoim ulubionym edytorze tekstu, sprawdź, czy wszystko jest w porządku. Następnie uruchom. Voila (sic)!źródło
Co powiesz na coś takiego?
źródło