Filesystemänderungen und DIFF

S

Sir Auron

Routinier
Also ich generiere mit find 2 Listen von meinem Dateisystem. Nun möchte ich jeweils eine Liste mit gelöschten (d.h. einfach sie sind nicht mehr am Platz wie bei Liste1) und neuen (d.h. einfach sie sind neu in einem Verzeichnis) Dateien. Mich interessiert nicht wie und wann sie bewegt wuden, sondern nur ob sie noch im Verzeichnis sind oder nicht und ob neue Dateien im Verzeichnis sind. Naja wie mache ich das? Ich habe es schon mit diff versucht, aber nach mehr als 40 Versuchen habe ich es dann aufgegeben. Hat jemand eine Idee wie man das realisieren könnte?
 
Was ist gegen diff einzuwenden?
Die Dateien mit < sind geloescht, die mit > sind dazugekommen bzw. haben sich geaendert (bei "diff <alt> <neu>").
Wenn du das Ganze mit --side-by-side und --suppress-common-lines ausgibst, wird es sogar richtig uebersichtlich. Was in den Listen drin ist, entscheidest du ja sowieso mit den ls-Optionen (oder wo kommt die Liste her?). Und wenns mehrere Verzeichnisse sein sollen, sollte sich doch mit grep und cut einiges bewegen lassen, oder?

-khs, der ueberlegt, ob tripwire das nicht auch koennte...
 
khs schrieb:
Was ist gegen diff einzuwenden?
Die Dateien mit < sind geloescht, die mit > sind dazugekommen bzw. haben sich geaendert (bei "diff <alt> <neu>").
Wenn du das Ganze mit --side-by-side und --suppress-common-lines ausgibst, wird es sogar richtig uebersichtlich. Was in den Listen drin ist, entscheidest du ja sowieso mit den ls-Optionen (oder wo kommt die Liste her?). Und wenns mehrere Verzeichnisse sein sollen, sollte sich doch mit grep und cut einiges bewegen lassen, oder?

-khs, der ueberlegt, ob tripwire das nicht auch koennte...
Ich will ja 2 Dateien mit neuen (siehe Definition im 1. Post) und gelöschten (siehe Definition im 1. Post) Dateien.
 
Wirklich keine Idee? Ich bräuchte das sehr dringend!
 
Dann poste doch mal nen kleinen Auszug wie die Dateien aussehen bzw. den Befehl wie Du sie erstellst. Vielleicht kann man ja da schon optimieren.
 
Hi Sir Auron,

erzeuge mit Hilfe von "find" eine Dateiliste vom aktuellen Stand und leite sie in eine Datei (dateiliste1.txt) um. Zu einen späteren Zeitpunkt lässt du den "find" nochmal laufen und wieder Umleiten in eine Datei (dateiliste2.txt).

Hier ein Beispiel des "find" vom Verzeichnis /home inkl. aller Unterverzeichnisse
Code:
# findet alle Verzeichnisse und Dateien
find /home -name "*" -print > /tmp/dateiliste1.txt
# Oder so: findet nur Dateien 
find /home -name "*" -type f -print > /tmp/dateiliste1.txt


Dann nim das nachstehende Script (Name: filediff.sh) und rufe es so auf:
Code:
/usr/local/bin/filediff.sh /tmp/dateiliste1.txt /tmp/dateiliste2.txt

Code:
# Script ablegen in /usr/local/bin als filediff.sh
if [ $# -ne 2 ]; then
        echo ""
        echo "Usage: $0 <oldfile> <newfile>"
        echo ""
        exit 1
fi

OLDFILENAME=$1
NEWFILENAME=$2
DIFF_FILE=/tmp/sdiff.txt
ADDED=/tmp/added.txt
DELETED=/tmp/deleted.txt

sdiff $OLDFILENAME $NEWFILENAME | egrep '(>|<)' > $DIFF_FILE
awk '{print $1" "$2}' $DIFF_FILE | awk '{if ($1==">") {print "added: "$2}}' $DIFF_FILE > $ADDED
awk '{print $1" "$2}' $DIFF_FILE | awk '{if ($2=="<") {print "deleted: "$1}}' $DIFF_FILE > $DELETED

rm $DIFF_FILE

echo "See new files in $ADDED"
echo "See deleted files in $DELETED"
# EOF

Dann liegen im /tmp Verzeichnis zwei neue Dateien.....

added.txt
deleted.txt

....mit den neuen bzw. gelöschten Dateien jeweils in einer seperaten Datei.

Wenn das mit dem "find" noch automatisieren willst kannst du drei Cronjobs anlegen (als root). An den geraden/ungeraden Wochentagen läuft der find, an den geraden auch das Script filediff.sh. So hast jeden Tag um 19:30 Uhr zwei neue Files (added.txt und deleted.txt).

Code:
00 19 * * 1,3,5 /usr/bin/find /home -name "*" -print > /tmp/dateiliste1.txt
00 19 * * 0,2,4,6 /usr/bin/find /home -name "*" -print > /tmp/dateiliste2.txt
30 19 * * 0,2,4,6 /usr/local/bin/filediff.sh /tmp/dateiliste1.txt /tmp/dateiliste2.txt
 
Zuletzt bearbeitet von einem Moderator:
bluelupo schrieb:
Hi Sir Auron,

erzeuge mit Hilfe von "find" eine Dateiliste vom aktuellen Stand und leite sie in eine Datei (dateiliste1.txt) um. Zu einen späteren Zeitpunkt lässt du den "find" nochmal laufen und wieder Umleiten in eine Datei (dateiliste2.txt).

Hier ein Beispiel des "find" vom Verzeichnis /home inkl. aller Unterverzeichnisse
Code:
# findet alle Verzeichnisse und Dateien
find /home -name "*" -print > /tmp/dateiliste1.txt
# Oder so: findet nur Dateien 
find /home -name "*" -type f -print > /tmp/dateiliste1.txt


Dann nim das nachstehende Script (Name: filediff.sh) und rufe es so auf:
Code:
/usr/local/bin/filediff.sh /tmp/dateiliste1.txt /tmp/dateiliste2.txt

Code:
# Script ablegen in /usr/local/bin als filediff.sh
if [ $# -ne 2 ]; then
        echo ""
        echo "Usage: $0 <oldfile> <newfile>"
        echo ""
        exit 1
fi

OLDFILENAME=$1
NEWFILENAME=$2
DIFF_FILE=/tmp/sdiff.txt
ADDED=/tmp/added.txt
DELETED=/tmp/deleted.txt

sdiff $OLDFILENAME $NEWFILENAME | egrep '(>|<)' > $DIFF_FILE
awk '{print $1" "$2}' $DIFF_FILE | awk '{if ($1==">") {print "added: "$2}}' $DIFF_FILE > $ADDED
awk '{print $1" "$2}' $DIFF_FILE | awk '{if ($2=="<") {print "deleted: "$1}}' $DIFF_FILE > $DELETED

rm $DIFF_FILE

echo "See new files in $ADDED"
echo "See deleted files in $DELETED"
# EOF

Dann liegen im /tmp Verzeichnis zwei neue Dateien.....

added.txt
deleted.txt

....mit den neuen bzw. gelöschten Dateien jeweils in einer seperaten Datei.

Wenn das mit dem "find" noch automatisieren willst kannst du drei Cronjobs anlegen (als root). An den geraden/ungeraden Wochentagen läuft der find, an den geraden auch das Script filediff.sh. So hast jeden Tag um 19:30 Uhr zwei neue Files (added.txt und deleted.txt).

Code:
00 19 * * 1,3,5 /usr/bin/find /home -name "*" -print > /tmp/dateiliste1.txt
00 19 * * 0,2,4,6 /usr/bin/find /home -name "*" -print > /tmp/dateiliste2.txt
30 19 * * 0,2,4,6 /usr/local/bin/filediff.sh /tmp/dateiliste1.txt /tmp/dateiliste2.txt
Erstmal danke! Aber eine C Implementierung fällt dir auch nicht ein oder?
 
Schade!
Könnest du mir sagen wie ich das mit Regular Expressions hinbekommen könnte?
 
Sir Auron schrieb:
Schade!
Könnest du mir sagen wie ich das mit Regular Expressions hinbekommen könnte?

Hi Sir Auron,

das Problem das du hier hast sind deine zwei Ausgabefiles das läßt sich so nur über ein Script realisieren. Du kannst natürlich das zu einen Befehl per Pipes zusammenhängen. Die Ausgabe hast du dann am Bildschirm oder in einer Ausagedatei.

Code:
sdiff liste4 liste5|egrep '(>|<)'|awk '{print $1" "$2}'|awk '{if ($1==">") {print "neu hinzu: "$2} else {if ($2=="<") {print "geloescht: "$1}}}'

# oder so

sdiff liste4 liste5|egrep '(>|<)'|awk '{print $1" "$2}'|awk '{if ($1==">") {print "neu hinzu: "$2} else {if ($2=="<") {print "geloescht: "$1}}}' > output.txt
 
bluelupo schrieb:
Hi Sir Auron,

das Problem das du hier hast sind deine zwei Ausgabefiles das läßt sich so nur über ein Script realisieren. Du kannst natürlich das zu einen Befehl per Pipes zusammenhängen. Die Ausgabe hast du dann am Bildschirm oder in einer Ausagedatei.

Code:
sdiff liste4 liste5|egrep '(>|<)'|awk '{print $1" "$2}'|awk '{if ($1==">") {print "neu hinzu: "$2} else {if ($2=="<") {print "geloescht: "$1}}}'

# oder so

sdiff liste4 liste5|egrep '(>|<)'|awk '{print $1" "$2}'|awk '{if ($1==">") {print "neu hinzu: "$2} else {if ($2=="<") {print "geloescht: "$1}}}' > output.txt

Danke für deine Bemühungen, aber ich fände es komfortabler Regular Expressions zu benutzen (schon wegen des Geschwindigkeit). Fällt dir da eine Lösung ein?
 
Sir Auron schrieb:
Danke für deine Bemühungen, aber ich fände es komfortabler Regular Expressions zu benutzen (schon wegen des Geschwindigkeit). Fällt dir da eine Lösung ein?

Hi,

ich weiß nicht so ganz wie du dir das vorstellst. In Perl sind Regular Expressions gut und einfach zu realisieren.

Allerdings hast du auch bei Perl das Problem das du erst mal vor den Vergleichen der beiden Dateilisten diese erstellen und den Stand in einer Datei "einfrieren" musst. Erst dann kommen die RegEx zum Einsatz. Das zeitkritische sind die Erstellung der beiden Dateilisten. Wenn du dich auf einen Teil des Verzeichnissbaumes beschränken kannst gehts natürlicher dementsprechend schneller.

Poste doch mal deinen Ansatz/Entwurf.
 
Also ich habs jetzt mit grep und strtok hinbekommen
 
Ja mach ich leider ist der Code noch ein bisschen verbugt!
 

Ähnliche Themen

Shell Skript beschleunigen

Partitionen auf SD-Karte lassen sich nicht löschen

GUbutnu 14.04 LTS DualMonitor-Mode: Ubuntu merkt sich die Bildschirmpositionen nicht

Bestimmte Dateien aus vielen Unterordnern löschen

CSV Datei mit sed manipulieren/optimieren/ergänzen

Zurück
Oben