PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : dateigrößen vergleichen



iberican
12.02.08, 00:36
Hi,
ich habe ein Verzeichniss mit vielen xml Dateien. Sobald nun neue Dateien hinzukommen möchte ich prüfen, ob diese bereits vorhanden sind mittels Dateigröße.
Meine Idee war nun den Inhalt des Verzeichniss einzulesen und zu vergleichen, aber das funktioniert nicht wie ich mir das vorstelle



#!/bin/sh
find *.xml >dir.txt
cat dir.txt
while read line
do
dgroesse=$(echo 'wc -c <$line' | awk '{print $1}')
tgroesse=$(echo 'wc -c <$line.tmp' | awk '{print $1}')
if test ${dgroesse} -eq ${tgroesse} ; then
echo "ist gleich!"
fi
done
done



vom Ansatz her versteht man wohl was passieren soll, doch leider stolper ich bei der Umsetzung

Vielen Dank für Eure Hilfe

m.o.o.
12.02.08, 00:58
Hallo.

Wie stellst du dir die Überprüfung vor, bzw. was meinst du mit "wenn neue Dateien hinzukommen"? Sollen nur die überprüft werden?

Der folgende Code vergleicht alle xml-Dateien in einem Verzeichnis paarweise; der find-Aufruf ist doppelt enthalten, das könnte man auch mit einer temporären Datei (so wie von dir angedeutet) lösen ("cat temp|while read FILE"):


#!/bin/sh

find -name "*.xml"|while read FILE1; do
find -name "*.xml"|while read FILE2;
do
echo $FILE1":"$FILE2
#Vergleichen...
done;
done;

.

Wenn du nur neu hinzukommende Dateien mit den alten vergleichen willst, dann kann man die find-Befehle mit verschiedenen Parametern versehen, z.B. den Inneren, dass nur Dateien gefunden werden, die vor x-Minuten geändert wurden; damit lassen sich die Vergleichsoperationen minimieren.

EDIT: wenn es Unterverzeichnisse in dem Verzeichnis gibt, dann sollte man find übrigens noch auf die aktuelle Verzeichnisebene einschränken (-maxdepth 1).

iberican
12.02.08, 10:02
ja hi,
ich habe es nicht exakt beschrieben.
ich habe ein verzeichniss mit den dateien 1.xml, 2.xml, 3.xml.
der dateiname setzt sich aus id und endung zusammen.
nun werden jede stunde die dateien 1,2,3 erneut heruntergeladen.
diese würde ich nun 1_tmp.xml etc benennen.
und nun soll geprüft werden, ob sich die dateigrößen unterscheiden.
im prinzip müssten alle dateien mit der endung tmp gelesen werde (evtl. in ein array) und dann schrittweise mit der zugehörigen tmp datei verglichen werden.
@milchmann: ich stelle mir das so vor,wie du es andeutest



#!/bin/sh

find -name "*_tmp.xml"|while read FILE1;
do find -name ".xml"|while read FILE2;
do vergleich ...
done;
done;


was hier jedoch nicht funktionier ist die suche nach dem zweiten file.
am besten wäre es, die id in einer variable zu haben.
wenn ich z.bsp. 1_tmp.xml prüfen will würde ich dann suche nach


fin -name "$id_tmp.xml"


danke für die hilfe
gruß

m.o.o.
12.02.08, 11:40
Hallo.

In deinem Code steht "find -name ".xml"", d.h. es werden nur die Dateien gesucht, die den Namen .xml haben.



#!/bin/sh

find -maxdepth 1 -name "*.xml" -printf "%f\n"|while read FILE1; do
ID=${FILE1%.xml};
if [ -f "$ID.xml.tmp" ]; then
SIZE1=`ls -1s $ID.xml|awk '{print $1}'`
SIZE2=`ls -1s $ID.xml.tmp|awk '{print $1}'`;
if [ $SIZE1 -eq $SIZE2 ]; then
echo "Datei $ID.xml und $ID.xml.tmp sind gleich groß";
#d.h. nicht, dass sie identisch sind!
else
echo "Datei $ID.xml und $ID.xml.tmp sind unterschiedlich groß";
fi;
else
echo "tmp-Datei zu $ID.xml nicht gefunden";
fi;
done;


Der Code verwendet find um die xml-Dateien im aktuellen Verzeichnis zu finden (der Name der tmp-Dateien hat dabei die Form ID.xml.tmp), das ist aber nur sinnvoll, wenn es sich um sehr viele xml-Dateien handelt. Wenn es wenige sind, würde ich dir "ls -1" statt "find -maxdepth 1 -name "*.xml" -printf "%f\n"" empfehlen.
Wenn du die Dateien übrigens auf Gleichehit überprüfen willst, solltest du deren Checksummen vergleichen (z.B. mit md5sum).

Gruß, Florian

iberican
12.02.08, 11:53
@milkman - beschtens . das ist schick.
aber kurze frage zu checksum, ich dachte es wäre ausreichend über die größe zu prüfen, da es sich ja quasi um texfiles handelt. da ist es doch sehr unwahrscheinlich, dass die größe nach einer änderung identisch ist???

m.o.o.
12.02.08, 12:04
@milkman - beschtens . das ist schick.
aber kurze frage zu checksum, ich dachte es wäre ausreichend über die größe zu prüfen, da es sich ja quasi um texfiles handelt. da ist es doch sehr unwahrscheinlich, dass die größe nach einer änderung identisch ist???

Nein, wieso sollte das so sein? Ein A braucht ja nicht mehr Speicherplatz als ein I ;)


florian@leuchtturm1:~/tmp$ ls -lh test1 test2
-rw-r--r-- 1 florian florian 4 2008-02-12 13:02 test1
-rw-r--r-- 1 florian florian 4 2008-02-12 13:02 test2
florian@leuchtturm1:~/tmp$ cat test1
ABC
florian@leuchtturm1:~/tmp$ cat test2
XYZ
florian@leuchtturm1:~/tmp$

iberican
12.02.08, 12:05
so, jetzt habe ich das ganze mal nach deinem hinweis geändert


#!/bin/sh

find -maxdepth 1 -name "*.xml" -printf "%f\n"|while read FILE1; do
ID=${FILE1%.xml};
if [ -f "$ID.xml.tmp" ]; then
m1=`md5sum $ID.xml|awk '{print $1}'`
m2=`md5sum $ID.xml.tmp|awk '{print $1}'`;
if [ $m1 = $m2 ]; then
echo "Datei $ID.xml und $ID.xml.tmp sind identisch";
#d.h. nicht, dass sie identisch sind!
else
echo "Datei $ID.xml und $ID.xml.tmp sind unterschiedlich groß";
fi;
else
echo "tmp-Datei zu $ID.xml nicht gefunden";
fi;
done; -n ´*.xml´



funktioniert einwandfrei!!
@Florian ..Vielen Dank

iberican
12.02.08, 12:20
Nein, wieso sollte das so sein? Ein A braucht ja nicht mehr Speicherplatz als ein I

ja da hast du natürlich recht.

aber kurze frage noch zur checksum.
welche option würdest du für checksum verwenden?
in meinem vorschlag habe ich checksum ohne option genommen.
weiß jedoch nicht wie checksum arbeitet...

m.o.o.
12.02.08, 13:04
aber kurze frage noch zur checksum.
welche option würdest du für checksum verwenden?
in meinem vorschlag habe ich checksum ohne option genommen.
weiß jedoch nicht wie checksum arbeitet...

Für die möglichen Optionen für md5sum schaust du am besten in die zugehörige Manpage.
Der Aufruf von md5sum ohne Option ist schon korrekt, da wird eine Prüfsumme berechnet und diese mit dem zugehörigen Dateinamen ausgegeben.

Gruß, Florian