Dateilisten-vergleicher
Dateilisten-vergleicher
Hallo,
ich benötige ein script welches zuerst eine Dateiliste von einem Verzeichniss erstellt.
Dies habe ich auch noch geschaff "ls -sh > .filelist".
Wenn nun eine neue Datei hinzukommt soll das Script mir die Größe und den Namen der neuen Dateien per ICQ (sprich centericq schicken "echo 'was zu sagen ist' | centericq -p icq -s msg -t 1098432")
Ich hab mir noch überlegt, dass Löschen von Dateien muss wohl auch im Script berücksichtigt werden.
ich benötige ein script welches zuerst eine Dateiliste von einem Verzeichniss erstellt.
Dies habe ich auch noch geschaff "ls -sh > .filelist".
Wenn nun eine neue Datei hinzukommt soll das Script mir die Größe und den Namen der neuen Dateien per ICQ (sprich centericq schicken "echo 'was zu sagen ist' | centericq -p icq -s msg -t 1098432")
Ich hab mir noch überlegt, dass Löschen von Dateien muss wohl auch im Script berücksichtigt werden.
Code: Alles auswählen
root@gms1:~/tmp# touch f1.txt
root@gms1:~/tmp# touch f2.txt
root@gms1:~/tmp# touch f3.txt
root@gms1:~/tmp# ls f*.txt >f1.lst
root@gms1:~/tmp# touch f4.txt
root@gms1:~/tmp# rm f2.txt
root@gms1:~/tmp# ls f*.txt >f2.lst
root@gms1:~/tmp# diff f1.lst f2.lst
2d1
< f2.txt
3a3
> f4.txt
gms
danke für deine schnelle Antwort, aber das bringt mir leider nichts.
Ich weiß nicht wie ich ein Script machen soll, das sagen wir alle 5 Minuten nach neuen Dateien überprüft. Es soll mir dann auch die MB Zahl mit angeben. (ich weiß ls -sh, aber dann steht "insgesamt [zahl]MB" oben in der Filelist-Datei)
Ich weiß nicht wie ich ein Script machen soll, das sagen wir alle 5 Minuten nach neuen Dateien überprüft. Es soll mir dann auch die MB Zahl mit angeben. (ich weiß ls -sh, aber dann steht "insgesamt [zahl]MB" oben in der Filelist-Datei)
Das ist auch eine neue Anforderungd4rkm3n hat geschrieben: Es soll mir dann auch die MB Zahl mit angeben. (ich weiß ls -sh, aber dann steht "insgesamt [zahl]MB" oben in der Filelist-Datei)
Für das starten von Scripts in regelmäßigen Abständen ist der cron daemon zuständig.
Siehe "man 5 crontab" wie du dein Script vom cron starten lassen kannst
willst du jetzt die Summe der Größe aller Dateien, die Differenz der Summe aller Dateien vorher und nachher, oder die Größe pro Datei
Gruß
gms
ich habe mir das so gedacht, wenn eine neue file in dem ordner erscheint, dann schreibt mir das script per centericq (im ersten thread erwähnt) , dabei sollen die Namen der neuen Dateien und ihre jeweiligen Größen übermittelt werden.
Beispiel einer bei mir ankommenden ICQ Nachricht:
Beispiel einer bei mir ankommenden ICQ Nachricht:
Code: Alles auswählen
23.01.06 07:43 Server:
Neue Datei(en)
------------------
Test.doc (3MB)
Test2.doc (2,5MB)
Ich habe jetzt folgende Ausgabe mit angefügtem Script erstellt:
Alles weitere sollte nun einfach gehen
Gruß
gms
Code: Alles auswählen
root@gms1:~/tmp# ./x.sh
Fre Jän 13 23:46:44 CET 2006 Server:
neue Datei(en):
f4.txt (504 MB)
f5.txt (8 MB)
Fre Jän 13 23:46:44 CET 2006 Server:
gelöschte Datei(en):
f3.txt (2004 MB)
Code: Alles auswählen
WATCHDIR=/root/tmp
WATCHFILES='*.txt'
function report() {
local doreport=1
local listfile=.report2
[ ! -f .report1 ] && { listfile=.report1; doreport=0; }
du $WATCHDIR/$WATCHFILES >$listfile
[ $doreport = 0 ] && return
local header=0
diff .report1 .report2 | grep '^>' | while read inout size file; do
[ $header = 0 ] && { echo "`date` Server:"; echo "neue Datei(en):"; }
echo "`basename $file` ($size MB)"
header=1
done
local header=0
diff .report1 .report2 | grep '^<' | while read inout size file; do
[ $header = 0 ] && { echo "`date` Server:"; echo "gelöschte Datei(en):"; }
echo "`basename $file` ($size MB)"
header=1
done
}
rm *.txt .report? 2>/dev/null
touch f1.txt
touch f2.txt
dd if=/dev/zero of=f3.txt bs=1024 count=2000 2>/dev/null
report
dd if=/dev/zero of=f4.txt bs=512 count=1000 2>/dev/null
dd if=/dev/zero of=f5.txt bs=512 count=10 2>/dev/null
rm f3.txt
report
Gruß
gms
Erstmal ein riesen Dank an dich für deine Bemühungen!
Ich habe nur den Pfad vom watchdir verändert. Aber egal was ich in test an txt erstelle oder lösche, es gibt nie eine Ausgabe und die F*.txt sind immer leer. Außerdem läuft das script nur unter root-rechten, was aber nicht weiter schlimm ist.
Ich habe nur den Pfad vom watchdir verändert. Aber egal was ich in test an txt erstelle oder lösche, es gibt nie eine Ausgabe und die F*.txt sind immer leer. Außerdem läuft das script nur unter root-rechten, was aber nicht weiter schlimm ist.
Code: Alles auswählen
WATCHDIR=/home/d4rkm3n/test
WATCHFILES='*.txt'
function report() {
local doreport=1
local listfile=.report2
[ ! -f .report1 ] && { listfile=.report1; doreport=0; }
du $WATCHDIR/$WATCHFILES >$listfile
[ $doreport = 0 ] && return
local header=0
diff .report1 .report2 | grep '^>' | while read inout size file; do
[ $header = 0 ] && { echo "`date` Server:"; echo "neue Datei(en):"; }
echo "`basename $file` ($size MB)"
header=1
done
local header=0
diff .report1 .report2 | grep '^<' | while read inout size file; do
[ $header = 0 ] && { echo "`date` Server:"; echo "gelöschte Datei(en):"; }
echo "`basename $file` ($size MB)"
header=1
done
}
rm *.txt .report? 2>/dev/null
touch f1.txt
touch f2.txt
dd if=/dev/zero of=f3.txt bs=1024 count=2000 2>/dev/null
report
dd if=/dev/zero of=f4.txt bs=512 count=1000 2>/dev/null
dd if=/dev/zero of=f5.txt bs=512 count=10 2>/dev/null
rm f3.txt
report
Der untere Block war nur für einen Schnelltest bestimmt, den ich im gleichen Verzeichnis durchgeführt habe. Dort fehlt bei allen Dateien die Verzeichnisangabe "$WATCHDIR/"
Diese Dateien werden jetzt im aktuellen Verzeichnis angelegt und wenn sich dieses von dem WATCHDIR unterscheidet, werden auch keine Änderungen gefunden.
Bei den Reportdateien (".report*") sollte eigentlich auch noch eine Verzeichnisangabe angefügt werden.
Das Script braucht für die entsprechenden Verzeichnisse Lese- bzw Schreibrechte
Gruß
gms
Diese Dateien werden jetzt im aktuellen Verzeichnis angelegt und wenn sich dieses von dem WATCHDIR unterscheidet, werden auch keine Änderungen gefunden.
Bei den Reportdateien (".report*") sollte eigentlich auch noch eine Verzeichnisangabe angefügt werden.
Das Script braucht für die entsprechenden Verzeichnisse Lese- bzw Schreibrechte
Gruß
gms
...so nun habe ich das Problem, dass meine globale Variable icqmsg oder icqmsg2 nicht 1 gesetzt werden falls das Script in den "# NEW Abschnitt #" oder "# Del Abschnitt #" gelangt und somit die beiden if-Abfragen am Ende des Scripts niemals ausgeführt werden.
Code: Alles auswählen
WATCHDIR=/media/extusb/download/downloaded
WATCHFILES='*'
export icqmsg="0"
export icqmsg2="0"
function checking() {
touch .filelist_tmp
du $WATCHDIR/$WATCHFILES > .filelist_tmp
# NEW Abschnitt #
local header=0
diff .filelist_tmp .filelist | grep '^<' | while read inout size file; do
[ $header = 0 ] && { echo "`date` Server:"; echo "neue Datei(en):"; }
echo "`basename $file` ($size MB)"
header=1
export icqmsg=1 && echo "set var: icqmsg: $icqmsg"
done
# DEL Abschnitt #
local header=0
diff .filelist_tmp .filelist | grep '^>' | while read inout size file; do
[ $header = 0 ] && { echo "`date` Server:"; echo "gelöschte Datei(en):"; }
echo "`basename $file` ($size MB)"
header=1
export icqmsg2=1 && echo "set var: icqmsg2: $icqmsg2"
done
}
checking
rm .filelist && cp .filelist_tmp .filelist
echo "checking vars: icqmsg: $icqmsg & icqmsg: $icqmsg2"
if [ $icqmsg = 1 ]; then
#do tasks on new#
echo "Tasks of new:"
fi
if [ $icqmsg2 = 1 ]; then
#do tasks on del#
echo "Tasks of del"
fi
echo ":: end ::"
Mit einer Pipe wird immer eine Subshell aufgemacht. Daher können auch keine Änderungen des Environments außerhalb wahrgenommen werden.
Die "export" Statements helfen da natürlich auch nicht, die helfen nur in die Gegenrichtung, also von Hauptshell zur Subshell.
Eine mögliche Lösung:
Du erstelltst mit dem "diff ... | grep ... | while " eine Ausgabedatei, welche du vorher gelöscht hast. Nur wenn diese Datei existiert mußt du diese auch versenden
Gruß
gms
Die "export" Statements helfen da natürlich auch nicht, die helfen nur in die Gegenrichtung, also von Hauptshell zur Subshell.
Eine mögliche Lösung:
Du erstelltst mit dem "diff ... | grep ... | while " eine Ausgabedatei, welche du vorher gelöscht hast. Nur wenn diese Datei existiert mußt du diese auch versenden
Code: Alles auswählen
[ -f .reportNEW ] && rm .reportNEW
checking
if [ -f .reportNEW ]; then
...
fi
gms