Dateilisten-vergleicher

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
d4rkm3n
Beiträge: 159
Registriert: 07.05.2005 14:36:43

Dateilisten-vergleicher

Beitrag von d4rkm3n » 13.01.2006 22:08:12

Hallo,
ich benötige ein script welches zuerst eine Dateiliste von einem Verzeichniss erstellt.
Dies habe ich auch noch geschaff :wink: "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.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 13.01.2006 22:19:44

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
Gruß
gms

Benutzeravatar
d4rkm3n
Beiträge: 159
Registriert: 07.05.2005 14:36:43

Beitrag von d4rkm3n » 13.01.2006 22:31:36

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)

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 13.01.2006 22:51:02

d4rkm3n 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)
Das ist auch eine neue Anforderung :wink:

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

Benutzeravatar
d4rkm3n
Beiträge: 159
Registriert: 07.05.2005 14:36:43

Beitrag von d4rkm3n » 13.01.2006 23:09:29

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:

Code: Alles auswählen

23.01.06 07:43 Server:
Neue Datei(en)
------------------
Test.doc (3MB)
Test2.doc (2,5MB) 

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 13.01.2006 23:50:46

Ich habe jetzt folgende Ausgabe mit angefügtem Script erstellt:

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

Alles weitere sollte nun einfach gehen

Gruß
gms

Benutzeravatar
d4rkm3n
Beiträge: 159
Registriert: 07.05.2005 14:36:43

Beitrag von d4rkm3n » 14.01.2006 00:37:04

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.

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


gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 14.01.2006 00:53:23

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

Benutzeravatar
d4rkm3n
Beiträge: 159
Registriert: 07.05.2005 14:36:43

Beitrag von d4rkm3n » 14.01.2006 20:13:44

danke für die hilfe!

ich habe mir mal die freiheit genommen und ne pm (private message) geschickt!

gruß
d4rkm3n

Benutzeravatar
d4rkm3n
Beiträge: 159
Registriert: 07.05.2005 14:36:43

Beitrag von d4rkm3n » 15.01.2006 18:10:07

...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 ::"

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 15.01.2006 20:43:12

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

Code: Alles auswählen

[ -f .reportNEW ] && rm .reportNEW
checking
if [ -f .reportNEW ]; then
  ...
fi
Gruß
gms

Antworten