Próbuję znaleźć sposób na sprawdzenie w danym katalogu zduplikowanych plików (nawet o różnych nazwach) i zastąpienie ich dowiązaniami symbolicznymi wskazującymi na pierwsze wystąpienie. Próbowałem z, fdupes
ale wyświetla tylko te duplikaty.
Taki jest kontekst: dostosowuję motyw ikon do swoich upodobań i odkryłem, że wiele ikon, nawet jeśli mają różne nazwy i różne lokalizacje w swoim folderze nadrzędnym i są używane do różnych celów, w zasadzie są takie same obrazek. Ponieważ zastosowanie tej samej modyfikacji dwadzieścia lub trzydzieści razy jest zbędne, gdy tylko jeden jest naprawdę potrzebny, chcę zachować tylko jeden obraz i dowiązać symbolicznie wszystkie pozostałe.
Na przykład, jeśli uruchomię się fdupes -r ./
w katalogu testdir
, może zwrócić mi następujące wyniki:
./file1.png
./file2.png
./subdir1/anotherfile.png
./subdir1/subdir2/yetanotherfile.png
Biorąc pod uwagę ten wynik, chciałbym zachować tylko plik file1.png
, usunąć wszystkie pozostałe i zastąpić je dowiązaniami symbolicznymi wskazującymi do niego, zachowując jednocześnie wszystkie oryginalne nazwy plików. Zachowa więc file2.png
swoją nazwę, ale stanie się łączem do file1.png
zamiast być duplikatem.
Te linki nie powinny wskazywać bezwzględnej ścieżki, ale powinny być względne w stosunku do testdir
katalogu nadrzędnego ; tj. yetanotherfile.png
będzie wskazywać ../../file1.png
, a nie/home/testuser/.icons/testdir/file1.png
Interesuję się zarówno rozwiązaniami, które obejmują GUI i CLI. Cytowanie go nie jest obowiązkowe fdupes
, ponieważ to narzędzie, które znam, ale jestem otwarty na rozwiązania wykorzystujące również inne narzędzia.
Jestem prawie pewien, że skrypt bash, który poradzi sobie z tym wszystkim, nie powinien być trudny do stworzenia, ale nie jestem wystarczająco ekspertem, aby dowiedzieć się, jak sam go napisać.
źródło
v1.51
(Ubuntu 14.04.2 LTS).jdupes
na github.com/jbruchon/jdupes ma-L
opcję, która wykonuje pożądane twarde łączenie duplikatów.${line//…/}
część nie działała dla mnie, więc zrobiłem czystszy sposób, aby uzyskać pierwszy plik „master” do hardlink.rsync
z innego rodzaju systemu plików? Lub jeśli system plików nie zachowuje hierarchii, np. Jest to serwer zapasowy, który wszystko podporządkowuje/«machine-name»/...
? A jeśli chcesz przywrócić z kopii zapasowej? Nie widzę, jak twarde linki będą tutaj przechowywane. Względne linki miękkie miałyby większą szansę na przetrwanie, jak sądzę.Jeśli nie lubisz dużo skryptów, mogę polecić rdfind . Który skanuje podane katalogi w poszukiwaniu duplikatów plików i łączy je na twardo lub miękko. Z powodzeniem wykorzystałem go do deduplikacji mojego katalogu klejnotów Ruby. Jest dostępny w Debian / Ubuntu.
źródło
Miałem podobną sytuację, ale w moim przypadku dowiązanie symboliczne powinno wskazywać na ścieżkę względną, więc napisałem ten skrypt Pythona, aby wykonać tę sztuczkę:
Dla każdego wiersza wejściowego (który jest listą plików) skrypt dzieli listę plików (oddzielone spacjami), pobiera ścieżkę względną z każdego pliku do pierwszego, a następnie tworzy dowiązanie symboliczne.
źródło
Tak więc odpowiedź udzielona przez arnefm (która została skopiowana przez Internet) nie dotyczy spacji w nazwach plików. Napisałem skrypt, który zajmuje się spacjami w plikach.
To polega na znajdowaniu duplikatów i zapisywaniu ich PIPE rozdzielonych na plik o nazwie „pliki”.
Następnie odczytuje plik z powrotem, wiersz po wierszu, do tablicy, a każdy element tablicy jest rozdzielany przez PIPE.
Następnie iteruje wszystkie nie pierwsze elementy tablicy, zastępując plik dowiązaniem symbolicznym do pierwszego elementu.
Plik zewnętrzny („pliki”) można usunąć, jeśli polecenie fdupes jest wykonywane w podpowłoce, do tego czasu jest odczytywane bezpośrednio, ale w ten sposób wydaje się wyraźniejsze.
źródło
Niektóre zastrzeżenia z przodu:
fdupes -1r common/base/dir | while read -r -a line ; do ln -sf $(realpath --relative-to ${line[1]} ${line[0]}) ${line[1]}; done
Jeśli więcej niż 2 pliki są duplikatami (np. Plik1 plik2 plik3), musimy utworzyć dowiązanie symboliczne dla każdej pary - traktuj plik1, plik2 i plik1, plik3 jako 2 osobne przypadki:
Wykorzystanie tej opcji do automatycznej obsługi dowolnej liczby duplikatów w wierszu wymaga nieco więcej wysiłku.
Innym podejściem byłoby najpierw utworzenie dowiązań symbolicznych do ścieżek bezwzględnych, a następnie ich konwersja:
Opiera się to na odpowiedzi @Gilles: /unix//a/100955/77319
źródło