Doppelte Dateinamen suchen

Hallo,

ich möchte (in mehr oder minderer Regelmäßigkeit) die Partitionen absuchen, ob der eine oder andere Dateiname von ca. 150 bestimmten Dateien mehrfach zu finden ist. Es reicht völlig, wenn im Ergebnis der Dateiname, der doppelt auftritt, angezeigt wird (ohne Pfadangabe etc.).

Kennt jemand ein kleines Tool hierfür, weil ich vom Programmieren nicht die Ahnung habe ?

Das wäre super klasse !
Besten Dank im voraus und sonnige Grüße
jwd

(ich hatte schon einmal in einem anderen Forum gepostet, aber noch keinen entsprechenden Hinweis erhalten)

ich möchte (in mehr oder minderer Regelmäßigkeit) die
Partitionen absuchen, ob der eine oder andere Dateiname von
ca. 150 bestimmten Dateien mehrfach zu finden ist. Es reicht
völlig, wenn im Ergebnis der Dateiname, der doppelt auftritt,
angezeigt wird (ohne Pfadangabe etc.).

Hi jwd,
deine 150 dateinamen in tabelle2 Spalte A.
Code funktioniert, leider zeigt er die gefundenen Dateien mehrfach an, k.A. warum.
Alt+F11, Einfügen Modul, Code reinkopieren, die Variable lw anpassen,Editor schliessen
Starten mit Extras–Makro–Makro–tt–ausführen bzw Buttonn aus Symbolleiste Formular.
Gruß
Reinhard

Option Base 1
Sub tt()
lw = "CD"
Set fs = Application.FileSearch
For n = 1 To Len(lw)
 With fs
 .LookIn = Mid(lw, n, 1) & ":\"
 .Filename = "\*.xls"
 .SearchSubFolders = True
 .Execute
 For i = 1 To .FoundFiles.Count
 dat = Mid(.FoundFiles(i), InStrRev(.FoundFiles(i), "\") + 1)
 Set c = Worksheets("Tabelle2").Range("a1:a500").Find(dat, LookIn:=xlValues)
 If Not c Is Nothing Then
 zei = IIf(zei = 0, 1, Cells(65536, 1).End(xlUp).Row + 1)
 Cells(zei, 1) = dat
 End If
 Next i
 End With
Next n
Range("A1:A" & zei - 1).Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub

Servus!

Ich habe mal ein Programm geschrieben, welches gleiche Dateien (mit gleichem Binären Inhalt) findet.

Würde dir sowas Helfen?

Gruß Pauli!

Fehler beim Kompilieren
Hallo Reinhard,

schon mal super besten Dank, doch ich bekomme die Fehlermeldung :
„Fehler beim Kompilieren. Variable nicht definiert“
Also in Deine Vorgabe lw = „CD“ habe ich mal CD, mal C und auch mal D eingetragen; auch wenn ich es für falsch gehalten habe, habe ich es dennoch auch mal jeweils mit :\ dahinter probiert.
Alle 6 Versuche ergaben die gleiche Fehlermeldung.
Meine Daten sind übrigens auf C und D und die Exceltabelle hatte ich jetzt mal auf D liegen. Letztere kann ich natürlich auch auf D deponieren.
Wo baue ich Mist ? Danke !

Sonnige Grüße
jwd

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Pauli,

das würde bedeuten, dass unabhängig der Dateinamen die Dateien mit gleichem Inhalt rausfiltert werden ? Würde mir bei dem von mir angesprochenen Problem nicht weiter helfen, jedoch einen anderen Fall „erschlagen“. Wenn Dein Programm auch für Menschen wie mich ohne Programmierkenntnisse zu bedienen ist, würde ich mich freuen, wenn Du es mir mal schicken (mailen ?) würdest.

Auch Dir schon mal besten Dank und sonnige Grüße
jwd

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

2 Dinge sind mir da noch aufgefallen :

.Filename = „*.xls“
bedeutet das , dass nur xls-Tabellen gesucht (verglichen) werden mit meinen 150 Dateinamen ? Wäre nicht so gut, denn es können auch *.exe oder *.doc sein.
die dritte Zeile in Deinem Code lw = „CD“
heißt dies call directory ? wenn ja, wie soll ich da denn die C und D Partiition darstellen ?

Nicht lachen, aber ich habe ja gesagt, dass ich vom Programmieren nicht die Ahnung habe - hihi

Grüße
jwd

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

schon mal super besten Dank, doch ich bekomme die
Fehlermeldung :
„Fehler beim Kompilieren. Variable nicht definiert“
Also in Deine Vorgabe lw = „CD“ habe ich mal CD, mal C und
auch mal D eingetragen; auch wenn ich es für falsch gehalten
habe, habe ich es dennoch auch mal jeweils mit :\ dahinter
probiert.
Alle 6 Versuche ergaben die gleiche Fehlermeldung.
Meine Daten sind übrigens auf C und D und die Exceltabelle
hatte ich jetzt mal auf D liegen. Letztere kann ich natürlich
auch auf D deponieren.
Wo baue ich Mist ? Danke !

Sonnige Grüße
jwd

haallo jwd,
ich habe den Code bei mir, win98/excel2000 getestet, da war/ist kein Kompilierungsfehler. Für/in lw trägs du nur die lauwerksbuchstaben ein, ohne \ o.ä.
Und ich habe es getestet, esfunktioniert bis auf den mir völlig unklaren Fehkler dass die Ergebnsse mehrfach angezeigt werden.
Ich stelle den Code in ein anderes Forum, vielleicht kann mir da jmd sagen wrum die Ergebnisse mehrfach kommen. Da ich deinen Kompilierungsfehler nichtvhabe weiss ich nicht was ich in diesem Punkt machen kann.
Welche Excelversion hast du?
Gruß Renhard

Hi Reinhard,

ich habe win2000 und Excel 2000

habe das wie Du gesagt hast in eine Excel-Tabelle gepackt, dort unter Tabelle2 beginnen mit A1

Option Base 1
Sub tt()
lw = „C“
Set fs = Application.FileSearch
For n = 1 To Len(lw)
With fs
.LookIn = Mid(lw, n, 1) & „:“
.Filename = „*.xls“

Und die Datei mit Deinem Code liegt jetzt auch auf C

Aber immer wieder dieser Kompilierungsfehler

mag das an der 2000er Version liegen ? blöd

hhm ??

Grüße
jwd

Und die Datei mit Deinem Code liegt jetzt auch auf C

Aber immer wieder dieser Kompilierungsfehler

mag das an der 2000er Version liegen ? blöd

Hallo jwd,
hast du Option Explicit eingestellt? Probiers mals so:
Sub tt()
Dim lw as String
Dim n as Long

restlicher Code

also alle Variablen durch Dim bekanntgeben.
Gruß
Reinhard

es ändert sich etwas
Hi Reinhard,

habe ich gemacht und dies steht jetzt bei mir :

Die Fehlermeldumg bleibt identisch, nur mit dem Unterschied, dass JETZT nicht links vo „c“ das lw bllau markiert wird, sondern das darunter liegende fs

Wenn Du noch Lust + eine Idee hast, würde es mich sehr freuen

Sonnige Grüße
jwd

Option Explicit

Option Base 1
Sub tt()
Dim lw As String
Dim n As Long
lw = „c“
Set fs = Application.FileSearch
For n = 1 To Len(lw)
With fs
.LookIn = Mid(lw, n, 1) & „:“
.Filename = „*.*“
.SearchSubFolders = True
.Execute
For i = 1 To .FoundFiles.Count
dat = Mid(.FoundFiles(i), InStrRev(.FoundFiles(i), „“) + 1)
Set c = Worksheets(„Tabelle2“).Range(„a1:a500“).Find(dat, LookIn:=xlValues)
If Not c Is Nothing Then
zei = IIf(zei = 0, 1, Cells(65536, 1).End(xlUp).Row + 1)
Cells(zei, 1) = dat
End If
Next i
End With
Next n
Range(„A1:A“ & zei - 1).Sort Key1:=Range(„A1“), Order1:=xlAscending, Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Ralf,

die Suchmaschine kannte ich in der Tat noch nicht, wirft in meinem Fall jedoch auch nichts anderes aus als Google. leider

Dennoch Danke + Grüße
jwd

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Die Fehlermeldumg bleibt identisch, nur mit dem Unterschied,
dass JETZT nicht links vo „c“ das lw bllau markiert wird,
sondern das darunter liegende fs
Wenn Du noch Lust + eine Idee hast, würde es mich sehr freuen

Hallo jwd,
klar habe ich ne Idee, ich wiederhol mein vorheriges Posting *g?

Option Base 1
Sub tt()
Dim lw As String
Dim n As Long
Dim fs 'k.A was man da schreibt
Dim c
Dim i
Dim zei
restlicher Code

Gruß
Reinhard

Sonnige Grüße
jwd

Option Explicit

Option Base 1
Sub tt()
Dim lw As String
Dim n As Long
lw = „c“
Set fs = Application.FileSearch
For n = 1 To Len(lw)
With fs
.LookIn = Mid(lw, n, 1) & „:“
.Filename = „*.*“
.SearchSubFolders = True
.Execute
For i = 1 To .FoundFiles.Count
dat = Mid(.FoundFiles(i), InStrRev(.FoundFiles(i),
„“) + 1)
Set c =
Worksheets(„Tabelle2“).Range(„a1:a500“).Find(dat,
LookIn:=xlValues)
If Not c Is Nothing Then
zei = IIf(zei = 0, 1, Cells(65536,
1).End(xlUp).Row + 1)
Cells(zei, 1) = dat
End If
Next i
End With
Next n
Range(„A1:A“ & zei - 1).Sort Key1:=Range(„A1“),
Order1:=xlAscending, Header:=xlNo, OrderCustom:=1,
MatchCase:=False, Orientation:=xlTopToBottom
End Sub

mühsam nährt sich das Eichhörnchen
Die Fehlermeldumg bleibt identisch, doch jetzt läuft es bis :
„dat“ (vor = Mid) wird blau hinterlegt; blöd,dass ich nur Timbuktu versteh

Grüße

Option Explicit

Option Base 1
Sub tt()
Dim lw As String
Dim n As Long
Dim fs 'k.A was man da schreibt
Dim c
Dim i
Dim zei
For n = 1 To Len(lw)
With fs
.LookIn = Mid(lw, n, 1) & „:“
.Filename = „*.*“
.SearchSubFolders = True
.Execute
For i = 1 To .FoundFiles.Count
dat = Mid(.FoundFiles(i), InStrRev(.FoundFiles(i), „“) + 1)
Set c = Worksheets(„Tabelle2“).Range(„a1:a500“).Find(dat, LookIn:=xlValues)
If Not c Is Nothing Then
zei = IIf(zei = 0, 1, Cells(65536, 1).End(xlUp).Row + 1)
Cells(zei, 1) = dat
End If
Next i
End With
Next n
Range(„A1:A“ & zei - 1).Sort Key1:=Range(„A1“), Order1:=xlAscending, Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub

Noch ein Dim dat einfügen am Anfang dann müßte es

Die Fehlermeldumg bleibt identisch, doch jetzt läuft es bis :
„dat“ (vor = Mid) wird blau hinterlegt; blöd,dass ich nur
Timbuktu versteh

so langsam werden.
Hallo jwd, wie heißt denn eigentlich, „hast du Option Explicit eingeschaltet“ auf timbuktisch? *gg
danach fragte ich schon 2mal und hätte echt was gebracht wenn du das beantwortet hättest.
Gruß
Reinhard

Grüße

Option Explicit

Option Base 1
Sub tt()
Dim lw As String
Dim n As Long
Dim fs 'k.A was man da schreibt
Dim c
Dim i
Dim zei
For n = 1 To Len(lw)
With fs
.LookIn = Mid(lw, n, 1) & „:“
.Filename = „*.*“
.SearchSubFolders = True
.Execute
For i = 1 To .FoundFiles.Count
dat = Mid(.FoundFiles(i), InStrRev(.FoundFiles(i),
„“) + 1)
Set c =
Worksheets(„Tabelle2“).Range(„a1:a500“).Find(dat,
LookIn:=xlValues)
If Not c Is Nothing Then
zei = IIf(zei = 0, 1, Cells(65536,
1).End(xlUp).Row + 1)
Cells(zei, 1) = dat
End If
Next i
End With
Next n
Range(„A1:A“ & zei - 1).Sort Key1:=Range(„A1“),
Order1:=xlAscending, Header:=xlNo, OrderCustom:=1,
MatchCase:=False, Orientation:=xlTopToBottom
End Sub

Sorry Reinhard,
aber ich dachte, wenn dort in dem Code steht „Option Explicit“ as ist das, was Du meinst.
Habe gerade mal unter Optionen geguckt, aber nix begrifflich Annäherndes gefunden.
WO finde ich denn bei den ganzen Möglichkeiten die Registrierkarte und das Häckchen, um Deine Frage beantworten zu könnnen ??

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

aber ich dachte, wenn dort in dem Code steht „Option Explicit“
as ist das, was Du meinst.
Habe gerade mal unter Optionen geguckt, aber nix begrifflich
Annäherndes gefunden.
WO finde ich denn bei den ganzen Möglichkeiten die
Registrierkarte und das Häckchen, um Deine Frage beantworten
zu könnnen ??

hallo jwd,
das Prinzip ist easy, du schaltest unter den Exceloptionen irgendwo Option Explicit ein oder aus, es heisst dort Variablendeklaration nötig oder sonstwie, ich habs nie eingeschaltet. Ist nicht das Thema, steht bei dir oben im Codebereich da irgendwo Option Explicit, wenn ja, lösche es und du kannst dir die ganzen Dims sparen oder lasse es stehen und schreib Dim dat in den Code. Option Explicit sagt nur aus dass jede Variable deklariert/definiert werden muss, dies geschieht durch Dim Name…
Gruß
Reinhard

Die Fehlermeldumg bleibt identisch, doch jetzt läuft es bis :
„dat“ (vor = Mid) wird blau hinterlegt; blöd,dass ich nur
Timbuktu versteh

so langsam werden.
Hallo jwd, wie heißt denn eigentlich, „hast du Option Explicit
eingeschaltet“ auf timbuktisch? *gg
danach fragte ich schon 2mal und hätte echt was gebracht wenn
du das beantwortet hättest.
Gruß
Reinhard

Grüße

Option Explicit

Option Base 1
Sub tt()
Dim lw As String
Dim n As Long
Dim fs 'k.A was man da schreibt
Dim c
Dim i
Dim zei
For n = 1 To Len(lw)
With fs
.LookIn = Mid(lw, n, 1) & „:“
.Filename = „*.*“
.SearchSubFolders = True
.Execute
For i = 1 To .FoundFiles.Count
dat = Mid(.FoundFiles(i), InStrRev(.FoundFiles(i),
„“) + 1)
Set c =
Worksheets(„Tabelle2“).Range(„a1:a500“).Find(dat,
LookIn:=xlValues)
If Not c Is Nothing Then
zei = IIf(zei = 0, 1, Cells(65536,
1).End(xlUp).Row + 1)
Cells(zei, 1) = dat
End If
Next i
End With
Next n
Range(„A1:A“ & zei - 1).Sort Key1:=Range(„A1“),
Order1:=xlAscending, Header:=xlNo, OrderCustom:=1,
MatchCase:=False, Orientation:=xlTopToBottom
End Sub

Laufzeitfehler
Hi Reinhard,

so wie ich Dich verstehe, ist das mit Option Explicit korrekt dargestellt. Wenn ich nun noch das Dim für dat einfüge, ändert sich die Fehlermeldung :
Laufzeitfehler 1004
Die Methode „Range“ für das Objekt „_Global“ ist fehlgeschlagen.
Buttons Beenden sowie Debuggen

Irgendwas scheint ja nicht zu klappen; eigentlich schade …

Option Explicit

Option Base 1
Sub tt()
Dim lw As String
Dim n As Long
Dim fs 'k.A was man da schreibt
Dim c
Dim i
Dim zei
Dim dat
For n = 1 To Len(lw)
With fs
.LookIn = Mid(lw, n, 1) & „:“
.Filename = „*.*“
.SearchSubFolders = True
.Execute
For i = 1 To .FoundFiles.Count
dat = Mid(.FoundFiles(i), InStrRev(.FoundFiles(i), „“) + 1)
Set c = Worksheets(„Tabelle2“).Range(„a1:a500“).Find(dat, LookIn:=xlValues)
If Not c Is Nothing Then
zei = IIf(zei = 0, 1, Cells(65536, 1).End(xlUp).Row + 1)
Cells(zei, 1) = dat
End If
Next i
End With
Next n
Range(„A1:A“ & zei - 1).Sort Key1:=Range(„A1“), Order1:=xlAscending, Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub

Hallo jwd,

ich möchte (in mehr oder minderer Regelmäßigkeit) die
Partitionen absuchen, ob der eine oder andere Dateiname von
ca. 150 bestimmten Dateien mehrfach zu finden ist. Es reicht
völlig, wenn im Ergebnis der Dateiname, der doppelt auftritt,
angezeigt wird (ohne Pfadangabe etc.).

Ich hab mal ein Perl-skript gebastelt, welches sowohl
unter Win als auch unter Unix dieses tut. Der Aufruf
unter Win wäre:
C:\> perl getdupe.pl c:\temp
das liefert rekursiv alle doppelten oder x-fachen
Dateien aus c:\temp… untereinander, hier noch mit
Pfadnamen.

Es sucht auch die ganze Platte durch und ist
so schnell wie Deine Platte Daten liefert.

Die Ausgabe (jetzt Dateiname /Verzeichnis)
kann man anpassen, in dem man in der Funktion
sub ZeigeDoppelteDateien herumschreibt.

Wo kriegt man Perl her, wenn man es nicht hat?
Unter Unix ist es bei den Distributionen dabei,
unter windows installiert man einfach Activeperl
(http://downloads.activestate.com/ActivePerl/Windows/…
aus http://www.activestate.com/Products/Download/Downloa…)

Der Praktische ist, man kann solche skripts auch
als zeitgesteuerte Batch, auf einem Webserver als
cgi-Programm usw. einsetzen.

Kennt jemand ein kleines Tool hierfür, weil ich vom
Programmieren nicht die Ahnung habe ?

Ich hänge es mal dran. Eine bitte an die Perl-Freaks:
ich lerne Perl gerade (wieder), komme von C - sieht man :wink:
und freue mich über einige nette Tipps …
[------ 8#!/usr/bin/perl

use strict;
use Win32; # remove this line under unix OS

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

main:
chdir $ARGV[0] if (defined $ARGV[0]);
Workproc();
exit(0);

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sub Workproc
{
my @table;
SucheDateien(@table);
SortiereDateinamen(@table);
ZeigeDoppelteDateien(@table);
}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sub SucheDateien # Achtung: rekursiv
{
my $rtable = shift;
my @dateien = LeseVerzeichnis();

chomp(my $path=pwd) ; # use this w/Unix

chomp(my $path=Win32::GetCwd()); # use this w/Win32
print "Suche in: ", $path, „\n“;

foreach my $datei (@dateien) {
push(@$rtable, [$datei, $path]) if (-f $datei); # record [a,b]
if (-d $datei and $datei ne „.“ and $datei ne „…“) {
chdir $datei;
SucheDateien($rtable); # rekursiv suchen
chdir „…“;
}
}
}

- - - - – - - - - - - - - - - - - - - - - - - - - - - - -

sub SortiereDateinamen
{
my $rtable = shift;
my @arr = sort ({lc $a->[0] cmp lc $b->[0]} @$rtable) ;
@$rtable = @arr;
}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sub ZeigeDoppelteDateien
{
my $rarray = shift;
my $count = @$rarray;
for (my $i=0; $i[0] eq lc $$rarray[$i+1]->[0]) {
print "mehrfach: ", $$rarray[$i]->[0], " -> ";
do { print „\t“, $$rarray[$i++]->[1], „\n“;
} while (lc $$rarray[$i-1]->[0] eq lc $$rarray[$i]->[0])
}
}
}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sub LeseVerzeichnis
{
opendir(MYDIR, „.“);
my @files = readdir(MYDIR);
closedir(MYDIR);
return @files;
}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Grüße

CMБ

das muss ich mir heute Abend mal näher zu Gemüte
führen !

Hi Semjon,

schon mal besten Dank für Deine Mühe; werde ich morgen ein Feedback geben. Bin sehr gespannt … (ob ich das gepeilt kriege ?!)

Viele Grüße
jwd

funktioniert nahezu
Hi Semjon,

das ließ mir keine Ruhe und ich musste das jetzt probieren.
Ich habe Dein Script auch zum Laufen bekommen, stoße jedoch noch auf 2 Dinge :

Dies hier habe ich nicht verstanden,

Die Ausgabe (jetzt Dateiname /Verzeichnis)
kann man anpassen, in dem man in der Funktion
sub ZeigeDoppelteDateien herumschreibt.

wo soll ich was einsetzen ??

Der andere Punkt ist : wenn ich die Datei getdube.pl unmittelbar starte, dann wird gesucht usw. und am Schluss schließt sie wieder.
gehe ich über DOS und starte, dann erhalte ich die Ergebnisse im DOS_Fenster, schaffe es jedoch nicht sie z.B. in eine *.txt Datei zu überführen. Was muss ich machen, dass ich die Ausgabe der Ergebnisse noch hinbekomme ?

Ist richtig, dass das Script nicht partitionsübergreifend läuft, also D: wird in dei Suche nicht mit einbezogen,ja ?

Aber das Teil ist ja sagenhaft schnell … wirklich cool !!!
(obwohl ich vom „Innenleben“ des Scripts soviel verstehe wie manch anderer möglicherweise von der Vogelschen Approximationsmethode - hihi)

Sonnige Grüße
jwd