07.03.2009, 00:52

Utility to discover double files

License: GPL v2

Download: fdf-0.2.2.tar.gz (13,5 KB)

Ein komfortables Tool um doppelte Dateien zu finden. Für die eingegeben Pfade überprüft es die enthaltenen Dateien auf gleichen Inhalt und gibt die Übereinstimmenden aus.

Changelog

Update auf 0.2.2 (07.03.2009, 00:52)

Update auf 0.2.1 (24.02.2009, 17:09)

  • Auflösung symbolischer Links repariert (rekursive Symlinks funktionieren immernoch nicht - dafür bedarf es der Erkennung, dass zwei Dateien die selben sind)
  • Zwei Fehler in der neuen Vergleichsroutine behoben, beides Zugriffe auf evtl. nicht allokierten Speicher

Update auf 0.2 (24.02.2009, 04:06)

  • Neue Option (-S) zur Ausgabe von Dateien, die alle äußeren Kriterien an gleiche Dateien erfüllen (Dateigröße, gleiche Dateinamen - falls spezifiziert), aber die sich in ihren Daten doch unterscheiden.
  • Komplette Überarbeitung des Vergleichsalgorithmus
    • Geschwindigkeitssteigerung durch Benutzung von Memory Mapped Files sodass die CPU nicht mehr der limitierende Faktor ist
    • Der Fehler zuvieler geöffneter Dateien wurde dadurch unterbunden, dass immer max. 2 Dateien geöffnet sind (resultiert ebenfalls in einer Geschwindigkeitssteigerung durch nur mehr sequentielles Lesen)
  • Behebung der Fehler in den Funktionen der -0- und -z-Schalter

Optionen

Test for double files
Usage: fdf [OPTS] { - | FILE } [ [OPTS] FILE ... ]

Options affecting only the input specified subsequently:
  -r        don't recurse into directories
  -s        follow symbolic links (can't handle recusive links yet)
  -x        stay on the filesystem the input resides on (recursive mode)
  -l RANGE  limit files to scan to those whose size is in RANGE
  -c        scan content of symbolic links and identify doubles (if used with
            the switch -s, only the contents of the first symlink encountered
            will be scanned)
  -p        mark input as preferred, output only doubles from this input when
            matching files from other inputs are found

RANGE is specified by [SIZE]-[SIZE], whereas SIZE is a positive integer which
may be post-fixed by 'b', 'k', 'm', 'g', 't', for bytes, kilo-, mega-, giga-
bytes, etc. The lower or upper limit can be omitted.

Other options:
  -o FILE   redirect output to FILE
  -0        separate file names from stdin by 0x00-bytes instead of newline
  -z        when writing file names, separate by 0x00-bytes instead of newline
  -f        file names of doubles must match as well
  -S        reverse mode, output single files, which have no doubles
  -k        fail fast
  -v        verbose output
  -D        debug output (generally not wanted)
  -q        suppress any output (except for -o option)

Ausgabe

Betrachtung des Inhalts eines Verzeichnisses test:

$ ls -l test/ test/bla?
test/:
-rw-r--r-- 1 kane kane  0 18. Feb 17:14 bla
drwxr-xr-x 2 kane kane  4 20. Feb 17:21 bla1
drwxr-xr-x 2 kane kane  3 20. Feb 17:21 bla2
drwxr-xr-x 2 kane kane  3 20. Feb 17:21 bla3
lrwxrwxrwx 1 kane kane  3 20. Feb 15:32 bla-ln -> bla
lrwxrwxrwx 1 kane kane  3 20. Feb 15:54 bla-ln2 -> bla
lrwxrwxrwx 1 kane kane  3 20. Feb 16:07 bla-ln3 -> blo
-rw-r--r-- 1 kane kane 75 18. Feb 17:17 buidl1
-rw-r--r-- 1 kane kane 76 18. Feb 16:35 build
-rw-r--r-- 1 kane kane 73 17. Feb 16:03 build2

test/bla1:
-rw-r--r-- 1 kane kane 73 17. Feb 17:11 build
-rw-r--r-- 1 kane kane 75 18. Feb 17:15 build3

test/bla2:
-rw-r--r-- 1 kane kane 73 17. Feb 17:11 build2

test/bla3:
-rw-r--r-- 1 kane kane 75 18. Feb 17:15 build3

Und die Ausgabe von fdf für dieses Verzeichnis:

$ fdf -c test
found 11 files...
Input#	Pref	Chunk#	Size	Path
1	.	0	3 b	test/bla-ln2
1	.	1	3 b	test/bla-ln

1	.	0	73 b	test/build2
1	.	1	73 b	test/bla2/build2
1	.	2	73 b	test/bla1/build

1	.	0	75 b	test/buidl1
1	.	1	75 b	test/bla3/build3
1	.	2	75 b	test/bla1/build3

Es ist zu erkennen, dass die Dateien build2, bla2/build2 und bla1/build miteinander übereinstimmen, sowie ebenfalls buidl1, bla3/build3 und bla1/build3. Die einzelnen Blöcke sind durch eine Leerzeile getrennt und enthalten Dateien, die den gleichen Inhalt besitzen.

Weil fdf mit -c aufgerufen wurde, hat es die beiden symbolischen Links bla-ln2 und bla-ln, die den gleichen Inhalt haben, ebenfalls untersucht und ausgegeben. Diese Überprüfung ist unabhängig von dem tatsächlichen Ziel der Symlinks. Soll dieses untersucht werden, so ist -s erforderlich.

Die einzelnen, durch Tab-Symbole getrennten Spalten der Ausgabe besagen Folgendes:

  • Input#: Die Nummer des Inputs wie in der Kommandozeile angegeben, beginnend bei 1; hier wurde nur ein Input (test) angegeben, sodass überall 1 erscheint.
  • Pref: Mittels des -p-Schalters kann ein Input als "preferiert" markiert werden; in der Ausgabe schlägt sich das für die zugehörige Datei wie folgt nieder:
    • .: der Input wurde nicht als preferiert markiert
    • p: der Input wurde als preferiert markiert aber es gab keine nicht-preferierten Inputs im aktuellen Block
    • P: der Input wurde als preferiert markiert und es gab andere, unterdrückte Input-Spezifikationen auf der Kommandozeile, die Dateien gleichen Inhalts enthielten im aktuellen Block
  • Chunk#: Nummer der Datei im aktuellen Blocks an zu vergleichenden Dateien (sprich, diejenigen, die die äußeren Kriterien an gleiche Dateien erfüllen: mindestens gleiche Dateigröße, optional via -f-Schalter auch gleicher Dateiname)
  • Size: Die Größe der Datei mit Suffix für Kilo-, Mega-, etc. -byte
  • Path: Pfad der Datei