Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Binärer Dateivergleich per Batchprogramm von Verzeichnisbäumen mit FC - wie, was ist zu beachten ?

Frage Entwicklung Batch & Shell

Mitglied: michel123

michel123 (Level 1) - Jetzt verbinden

31.03.2007, aktualisiert 25.04.2007, 8476 Aufrufe, 8 Kommentare

Nach einem Systemabsturz scheint auch die Datenpartition Schäden davon getragen zu haben. Auf unterschiedlichen Wegen habe ich Sicherungen der Datenpartition auf anderen Festplatten gemacht (Kopieren im Windows, mit Utility vom Festplattenhersteller die gesamte Partition kopiert und mit einem Recovery-Programm) --> 3 Partitionen deren Inhalt identisch sein sollte. Ist er aber nicht - unterschiedliche Gesamtgröße und Dateizahl. --> nicht alle Dateien sind in allen drei Kopien vorhanden.

Nun möchte ich die Dateien miteinander binär vergleichen, da ich bereits eine Datei gefunden habe (ein Bild) das in der Vorschau anscheinend richtig angezeigt wird, beim Bearbeiten stellt sich aber heraus, daß etwas mit diesem Bild nicht stimmt. In einer anderen der 3 Kopien kann das Bild problemlos bearbeitet werden.

Einige der Daten habe ich auf einer USB-PLatte aber leider nicht alle.

Asche auf mein Haupt, daß ich mich nicht konsequenter um die Sicherung der Daten bemüht habe.

Technische Daten:
Betriebssystem: Win XP Home mit SP2
Dateianzahl: ca. 12.000
Dateigröße: wenige Byte bis ca. 9 GB (AVI-DV-Datei)
Anzahl Verzeichnisse: viele
Namen Dateien und Verzeichnisse: mit Leerzeichen, äöüÄÖÜ', alles was lt. Windows XP zulässig ist.

Meine Vorstellung zur Problemlösung:
Mit
dir d:\ /S /B > dir_d.txt
Liste mit allen Dateien erzeugen.
In der Datei stehen dann Zeilen wie:
d:\temp
d:\tmp
d:\temp\img_1234.tif
d:\tmp\capture_1.avi
Leider stehen in der Datei aber auch die Verzeichnisse und ich kann nicht ausschließen, daß es Punkte im Ordnernamen gibt. Es könnte außerdem auch Dateien ohne Erweiterung geben. Wie können die reinen Pfadangaben aus diesr Liste aussortiert werden, da sie beim Filecompare nur unnötige Fehlermeldungen produzieren (s.u.).

Zur Prüfung stelle ich mir eine Batch-Datei mit Schleife vor, in der die Einträge der obigen Liste abgearbeitet werden, in z.B. folgender Art:
FOR /F "delims=: tokens=1,2" %%i IN (dir_d.txt)
DO
FC / b d:\%%j e:\%%j > NULL
IF ERRORLEVEL "für Dateien sind identisch" @ECHO identisch %%j >> Ergebnis.txt
IF ERRORLEVEL "für Dateien sind unterschiedlich bzw. nicht vorhanden" @ECHO Fehler %%j >> Ergebnis.txt
IF ERRORLEVEL "für Dateien sind unterschiedlich bzw. nicht vorhanden" @ECHO Fehler %%j >> Fehler.txt
Ende der FOR-Schleife

"%%j" soll die Pfadangabe und den Dateinamen, jedoch ohne Laufwerksangabe enthalten.
Umleitung der Ausgabe nach Null (Nirvana), da bei Unterschieden in den Dateien die Ausgabe der Unterschiede nicht weiter interessiert.
Ausgabe in zwei Dateien, daß einerseits eine Kompakte Darstellung erreicht wird (Fehler.txt) und andererseits ein Log-Datei protokolliert, welche Dateien berücksichtigt wurden (Ergebnis.txt).

Der Anfang mit
FOR /F "delims=: tokens=1,2" %%i IN (dir_d.txt) DO @echo FC / b d:\%%j e:\%%j
liefert den Befehlsaufruf, und der sieht auf den ersten Blick auch gut aus.
Leider gibt es aber auch folgendes
FC /b d:\temp e:\temp
Wie zu erkennen ist, fehlen die Dateien am Ende der Pfadangabe, da in der Datei "dir_d.txt" auch solche Zeilen enthalten sind - für jedes Verzeichnis eine - leider (s.o.).

Auch das mit der Umleitung nach NULL und der Auswertung des ERRORLEVELS funktioniert nicht wie ich mir das vorstelle.
Was ist hierbei zu beachten ?

Welche Errorlevel gibt es bei Filecompare FC und wofür stehen sie ?

Darf die FOR-Schleife aus mehreren Zeilen bestehen ?
Ein NEXT %%i scheint es nicht zu geben. Woran wird das Ende der FOR-Schleife erkannt ?

Ist eine FOR-Schleife hier überhaupt das richtige ?
Wie sind die Variablen aus der Datei dir_d.txt zu übergeben, daß bei der Übergabe die Leer- und Sonderzeichen im Pfad- und Dateinamen richtig verarbeitet werden, ...
Wie können die Zeilen ohne Dateiname am Ende aus der "dir_d.txt" eleminiert werden ?
Es gibt sicher weitere Fallstricke wie nach der Lektüre einiger anderer Beiträge vermute.

Bitte helft mir weiter.

Vielen Dank für die Hilfen.
Gruß Michel
Mitglied: bastla
01.04.2007 um 11:57 Uhr
Hallo michel123 und willkommen im Forum!

Um Verzeichnisse auszuschließen kannst Du den "dir"-Befehl um den Schalter "/a-d" ergänzen.

Die Schleife könntest Du wie folgt aufbauen:
01.
@echo off & setlocal 
02.
if exist C:\Ergebnis.txt del C:\Ergebnis.txt 
03.
if exist C:\Fehler.txt del C:\Fehler.txt 
04.
for /f "tokens=1* delims=:" %%i in (C:\dir_d.txt) do call :ProcessFile "%%j" 
05.
goto :eof 
06.
:ProcessFile 
07.
if not exist "d:%~1" goto :Fehler 
08.
if not exist "e:%~1" goto :Fehler 
09.
fc /b "d:%~1" "e:%~1" >nul || goto :Fehler 
10.
echo identisch %~1>>C:\Ergebnis.txt 
11.
goto :eof 
12.
:Fehler 
13.
echo Fehler %~1>>C:\Ergebnis.txt 
14.
echo Fehler %~1>>C:\Fehler.txt 
15.
goto :eof
Kurze Erklärung:
Der Ordnung halber habe ich der Dateiliste und den Protokolldateien einen Pfad (im Beispiel "C:\") zugeordnet.

Durch den Unterprogrammaufruf zur Verarbeitung der einzelnen Dateien kannst Du nicht nur mehrere Befehlszeilen verwenden, sondern auch sehr flexibel die Verarbeitung steuern - das "goto :eof" entspricht einem "Return".

Das Unterprogramm ist wie eine weitere Batchdatei zu betrachten, daher werden auch die übergebenen Parameter mit %1, %2, etc nummeriert. Übergeben werden die Dateinamen mit einschließenden Anführungszeichen, damit enthaltene Leerstellen keine Probleme verursachen.

Die Sonderzeichen sollten unproblematisch sein, da die Dateiliste ja ebenfalls aus der CMD-Shell erstellt und daher die gleiche Codepage (vermutlich 850) verwendet wird.

Die Schreibweise %~1 entfernt beim übergebenen Dateinamen die Anführungszeichen wieder.

Mit "||" wird bei einem Errorlevel > 0 (also "Fehler") der folgende Befehl ausgeführt.

Anmerkung: Durch die Verwendung des Delimiters ":" beginnen die Dateinamen/-pfade jeweils mit einem "\" - wenn's stören sollte, könnte alternativ unter Verwendung einer dazwíschengeschalteten Variable einfach der Name/Pfad ab dem 4. Zeichen (also hinter "D:\" beginnend) verwendet werden.

Grüße
bastla
Bitte warten ..
Mitglied: michel123
01.04.2007 um 23:55 Uhr
Hallo Bastla,

Danke - es funktionierte auf Anhieb.
Gut fand ich insbesondere auch, daß Du einige Sachen noch erklärt hast.

Auf 2 Probleme bin ich noch gestoßen:
- Systemabsturz nach einiger Zeit und Reboot, ohne das ich eingriff - Ursache unbekannt, auch die Ereignismeldungen gaben hierzu nichts her,
- Abbruch der Abarbeitung bei einem Dateinamen, der Anführungszeichen (") enthielt.
Hie hat mir die Log-Datei gute Dienste geleistet.

Die Dateien mit Anführungszeichen im Namen habe ich aus der Liste entfernt.

Als Laufzeit für den ersten Vergleich habe ich ca. 7 h errechnet (aus Task-Manager, Prozesse, Spalte E/A-Bytes lesen). Ich bin gespannt wie lange es tatsächlich dauern wird.
Ich vermute das liegt auch daran, daß die beiden zu vergleichenden Partitionen auf einer Platte liegen. Die dritte zu vergleichende Partition liegt auf einer anderen Platte.

Falls Dir hierzu noch Verbesserungen einfallen - nur her damit.

Schon jetzt frohe Ostern für alle.

Gruß
Michel
Bitte warten ..
Mitglied: Biber
02.04.2007 um 18:00 Uhr
Moin michel123,

willkommen im Forum.
Die Dateien mit Anführungszeichen im Namen habe ich aus der Liste entfernt.

Na, so weit wollen es aber nicht kommen lassen...
01.
<u>Streiche:</u> for /f "tokens=1* delims=:" %%i in (C:\dir_d.txt) do call :ProcessFile "%%j" 
02.
<u>Setze:</u> for /f "delims=" %%i in (C:\dir_d.txt) do call :ProcessFile "%%~pnxi"
Gruss
Biber
Bitte warten ..
Mitglied: Biber
18.04.2007 um 23:01 Uhr
Moin michel123,

Nachfrage: wie ist denn der gefühlte Beantwortungsgrad Deiner Frage?

Gruss
Biber
Bitte warten ..
Mitglied: michel123
25.04.2007 um 20:30 Uhr
Hallo Biber,

bitte entschuldige die Funkstille meinerseits - ich war im Osterurlaub.
Ich hoffe Du hattest auch schöne Tage.

Den Nachtrag bzgl. der Anführungszeichen im Dateinamen habe ich erst heute gelesen - und noch nicht ausprobiert.
Glücklicherweise konnte ich auf diese Dateien auch verzichten bzw. sie problemlos neu erstellen - es handelte sich um abgespeicherte WEB-Seiten.

Die Rechnerabstürze könnten möglicherweise darauf zurückzuführen sein, daß die Sicherungsfestplatten nicht im Rechner eingebaut sind - sie liegen auf dem Rechner und wurden unerwarteterweise ziemlich heiß. Mir scheint die Samsung T166 werden deutlich wärmer als die Samsung P120 Modelle. Vielleicht fehlte hier der Luftzug im Rechnergehäuse.

Der Vergleich zweier Partitionen auf einer Festplatte dauerte zwischen 14 und 15 Stunden.
Die Vergleiche der Daten auf unterschiedlichen Festplatten ging deutlich schneller ca. 3 h und ich glaube auch ohne Rechnerabstürze.

Vielen Dank für Deine Ergänzung - ich werde sie demnächst ausprobieren.

Gruß
Michel
Bitte warten ..
Mitglied: Biber
25.04.2007 um 21:42 Uhr
Moin michel123,

ich hoffe, Du hast im Osterurlaub Aufregenderes erlebt als einen binären Dateivergleich per Batch.

Wie ich für mich aussieht, könnten wir den Beitrag auf "Gelöst" und "Geschlossen" setzen, oder?

Denn grundsätzlich scheint es ja zu laufen.
Und wenn es eine einmalig notwendige Aktion war, dann lohnt es sich sicherlich kaum, die oben mit einer Handvoll Batchzeilen zusammengekitteten FC-Aufrufe aus Performance-Gründen komplett in irgendeiner Hochsprache nachzubilden.

Bei dem Versuch könnte ja der nächste Osterurlaub draufgehen...*gg

Grüsse
Biber
Bitte warten ..
Mitglied: michel123
25.04.2007 um 22:00 Uhr
Hallo Biber,
ich stimme Dir zu.
Wer macht das "auf gelöst setzten" und falls das meine Aufgabe ist - wie mache ich das ?
Gruß
Michel
Bitte warten ..
Mitglied: Biber
25.04.2007 um 22:32 Uhr
Moin michel123,

im Prinzip teilen sich Beitragsersteller und der Mod des Unterforums diese (angenehme) Aufgabe.

Ein angemeldeter/eingeloggter Fragesteller kann direkt unter der Eröffnungsfrage den Button "Editieren" anklicken.
Im Folgefenster sind dann einige Kontrollkästchen anwählbar, unter anderem "Dieser Beitrag gilt als gelöst".
Damit erzeugst Du diesen hübschen grünen Erledigt-Haken.

Danach wird/sollte dann der zuständige Mod diesen Beitrag schließen.
(Der Mod hat dann ein oder zwei Kontrollkästchen mehr, z.B.
"Dieser Beitrag ist geschlossen und kann nicht mehr beantwortet werden.")

Und dieses Schließen eines Beitrags ist (mir) deshalb so wichtig, weil sonst Jahre später irgendeine Schafsnase einen Kommentar druntersemmelt beginnend mit "ich hab genau dasselbe problem, abba mein Drucker schmiert dabei immer so..."

Und diese Menschen sollen dann lieber einen neuen Beitrag aufmachen.

So, back to thread.... ich lass Dir dann mal den Vortritt, damit Du es ausprobieren kannst.

Schönen Abend
Biber
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
SAN, NAS, DAS
gelöst Betriebssystem für FC Storage ? (4)

Frage von MaxZander1982 zum Thema SAN, NAS, DAS ...

Vmware
VMWare NFS iSCSI FC (6)

Frage von clSchak zum Thema Vmware ...

SAN, NAS, DAS
gelöst Verbindung zwischen Windows2012 R2 und Fujitus Storage DX 60 via FC (3)

Frage von goaknecht zum Thema SAN, NAS, DAS ...

Benchmarks
MS SQL iSCSI oder FC ? (6)

Frage von Wein-A zum Thema Benchmarks ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (14)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...