Terminal pogryzł człowieka: rdfind
Kiedy po wielomiesięcznym upychaniu gdzie się da „ważnych plików” przychodzi do ich sprzątnięcia, niejednemu użytkowniki przechodzi ochota na takowe po wstępnym przeglądnięciu już samej struktury katalogu domowego. Dziesiątki katalogów „ważne”, „pilne”, setki kopii, każdy plik z wykrzyknikiem, kopie bezpieczeństwa w 20 wariantach i tak dalej. Tak, trzeba wykazać się żelazną samodyscypliną aby nie śmiecić lub uprzątnąć to co się narobiło. Ale w zmaganiach z narosłą stertą plików nie jesteśmy osamotnieni, taki niepozorny rdfind na początku pozwoli uporać się nam z duplikatami.
Choć wyszukiwanie takich samych plików nie brzmi skomplikowanie, to rdfind przeprowadza tę operację wzorowo. W podanej przez nas lokalizacji każdy z plików o takiej samej objętości jest porównywany na kilku etapach. Najpierw sprawdzane są pierwsze bajty takiego znaleziska, potem ostatnie, jeżeli są takie same, obliczana jest suma md5 lub sha1. Na tym nie koniec – rdfind spróbuje również ustalić który z plików jest „oryginałem” (na podstawie jego położenia w systemie plików i kolejności znalezienia).
A co rdfind zrobi po ustaleniu powiązań pomiędzy plikami? Domyślnie generuje on plik results.txt, gdzie czarno na białym (lub na odwrót) ujrzymy listę takich samych plików posortowaną wg. oryginałów i kopii. Każdy z plików jest dodatkowo opisany:
DUPTYPE_UNKNOWN some internal error
DUPTYPE_FIRST_OCCURRENCE the file that is considered to be the original.
DUPTYPE_WITHIN_SAME_TREE files in the same tree (found when processing the directory in the same input argument as the original)
DUPTYPE_OUTSIDE_TREE the file is found during processing another input argument than the original.
Jeżeli wiemy, czego możemy się spodziewać po przefiltrowaniu określonych katalogów, możemy skorzystać z parametrów -deleteduplicates i -makesymlink / -makehardlink. Pierwszy z nich wykasuje duplikaty, kolejne utworzą miękkie lub twarde dowiązanie duplikatów do oryginału (czyli zachowamy nazwy).
Oczywiście lista opcji programu jest o wiele bardziej bogatsza:
$# rdfind usage: rdfind [options] directory1 directory2 ... Finds duplicate files in directories, and takes appropriate actions Directories listed first are ranked higher, meaning that if a file is found on several places, the file found in the directory first encountered on the command line is kept, and the others are considered duplicate. options are (default choice within parantheses) -makesymlinks true |(false) replace duplicate files with symbolic links -makehardlinks true |(false) replace duplicate files with hard links -deleteduplicates true |(false) delete duplicate files -ignoreempty (true)| false ignore empty files -removeidentinode (true)| false ignore files with nonunique device and inode -makeresultsfile (true)| false makes a results file -outputname name sets the results file name to "name" (default results.txt) -followsymlinks true |(false) follow symlinks -dryrun|-n true |(false) print to stdout instead of changing anything -checksum (md5)| sha1 checksum type -sleep Xms sleep for X milliseconds between file reads. Default is 0. Currently, only a few values are supported; 0,1-5,10,25,50,100
Nie trudno uzmysłowić sobie scenariusze wykorzystania tego narzędzia. Wspomniane oczyszczanie katalogów z duplikatów to doskonały przedwstęp do np. tworzenia z nich kopii zapasowych, itp.
I co najważniejsze – program występuje w głównych repozytoriach większości dystrybucji, stąd też nie powinniśmy mieć problemu z jego zainstalowaniem.