Shell-Script Erzeugen einer Datei-Liste

Post Reply
Message
Author
Thomas

Shell-Script Erzeugen einer Datei-Liste

#1 Post by Thomas »

Bei dem nachfolgenden Script habe ich folgendes Problem:
Wenn eine Datei enthalten ist die ein Leerzeichen hat (neue Dateien auf den Rechner.dat) dann enthält die Liste
nur folgenden Eintrag - "neue" der Rest fehlt.
Ich finde den Fehler in dem Script nicht (stammt nicht von mir)
Wie kann ich den script schrittweise ablaufen lassen? Mit der Variablen set -vx läuft das mir zu schnell.

Der Script bringt mich noch zum Wahnsinn !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Script:
#!/bin/sh

(echo -e user $FTPUSER $FTPPASS \
\<!--no-->npassive \
\<!--no-->verbose \
\<!--no-->ncd $REMOTEDVZ \
\<!--no-->nls -lR $FILELISTE \
\<!--no-->n ) \
| ftp -ni $FTPSERVER
for i in `egrep ^'\./|\-r' $FILELISTE`
do
# $i is a directory
if [ -n "`echo $i | egrep ^'\./'`" ] ; then
# we have a directory, remove colon
AKTDVZ=`expr $i : '\(.*\):<!--no-->.*'`
if [ ! -d "$AKTDVZ" ] ; then
mkdir $AKTDVZ
fi
fi
# $i is a file
if [ ! -z "`echo $i | egrep ^'\-r'`" ] ; then
FILEPARAM=1
continue
fi
# ignore file parameters
case $FILEPARAM in
[1-3]) FILEPARAM=`expr $FILEPARAM + 1`;;
4) FILEGROESSE=$i; FILEPARAM=`expr $FILEPARAM + 1`;;
[5-7]) FILEPARAM=`expr $FILEPARAM + 1`;;
8) FILENAME=$i;;
*) continue;;
esac
# get the filename
if [ -n "$FILENAME" ] ; then
# if file not exists
if [ ! -f "$AKTDVZ/$FILENAME" ] ; then
echo $AKTDVZ/$FILENAME >> $FILES2GET
else
# file is probably changed
set -- `ls -l $AKTDVZ/$FILENAME`
if [ "$FILEGROESSE" -ne "$5" ]; then
echo $AKTDVZ/$FILENAME >> $FILES2GET
fi
fi
FILENAME=
FILEGROESSE=0
FILEPARAM=0
fi
done

Jochen

Re: Shell-Script Erzeugen einer Datei-Liste

#2 Post by Jochen »

Zuerst einmal: Hat das Board Dein Skript zerrupft? Ich sehe nirgends eine Zuweisung an FILELISTE. Wenn Du [<!--no-->code] ...[<!--no-->/code] um Dein Skript setzt, bleibt die Einrückung erhalten und es wird nicht so zerrupft. Und wenn Du im Klartext mit dazu schreibst, was das Skript eigentlich machen soll, kämpft man sich eher durch die expr-Aufrufe als ohne Beschreibung...

So weit ich' gerafft habe, soll das Skript einen FTP-Server sozusagen händisch spiegeln: Alle Dateien und Unterverzeichnisse durchgehen und eine Liste aller neuen/veränderten Dateien in Datei $FILES2GET abspeichern. So weit, so gut.

Aber ich sehe nicht recht, inwieweit das Skript überhaupt funktionieren kann. Die Ausgabe vom "ls -lR" des FTP-Servers liefert Dir den Verzeichnisbaum aller in $FILELISTE enthaltenen Verzeichnisse und Dateien. Das egrep in der for-Schleife läuft für jeden dieser Einträe in $FILELISTE einmal. Aber Du behandelst Die Einträge so, als ob sie die Ausgabe des FTP-Servers wären; das sind sie aber nicht.

Später sieht es so aus, als würdest Du eine Ausgabezeile von Hand zerlegen, um an die Grösse der Datei und deren Namen zu kommen. Abgesehen davon, dass das Verfahren viel zu kompliziert ist, ist es eben auch bei Blanks im Dateinamen fehleranfällig: Der Fall * im case-Statement setzt den nächsten Schleifendurchlauf an, wenn mehr als 8 Einträge zu so einer Zeile bestehen. Damit wird der Rest des Dateinamens (Arg. 8) überschlagen. Irgendwo (und ich habe nicht gefunden, wo!) trennt Dein Skript an den Leerstellen in so einer Zeile die Wörter auf und setzt sie zeilenweise. Das trifft aber auch Leerstellen im Dateinamen...

Schau Dich entweder nach einem anderen Skript um oder programmier es Dir neu. awk oder perl wären dabei die richtige Wahl.

Und nein, ein Single-Stepping für Shellskripte gibt es nicht. Für die ksh gab es mal vor Urzeiten ein "kshdbg"-Skript in der iX, in der ksh selbst implementiert! Aber für die bash oder sh ist mir da nichts bekannt.

Jochen

Ozi

Re: Shell-Script Erzeugen einer Datei-Liste

#3 Post by Ozi »

Hi,

zum debuggen machst du folgendes:

Ändere die Zeile

#!/bin/bash

in

#!/bin/bash -x

dann siehst du, mit was die Shell nach den einzelnen Befehlen weiterarbeitet. Damit findest du den Fehler
ganz bestimmt. Nur nicht aufgeben <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

@Jochen

Sowas solltest du doch wissen als Shellprofi, oder ?

<img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

cu

Oliver

Jochen

Re: Shell-Script Erzeugen einer Datei-Liste

#4 Post by Jochen »

@Oliver:

Sischer dat. <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Aber Thomas schreibt, dass es ihm mit "mit set -vx zu schnell geht". Ein "set -x" bewirkt exakt das gleiche wie "bash -x". Mit der Information ist Thomas also nicht geholfen...

Jochen

Ozi

Re: Shell-Script Erzeugen einer Datei-Liste

#5 Post by Ozi »

Tja,

so kann's gehen ....

hugenay

Re: Shell-Script Erzeugen einer Datei-Liste

#6 Post by hugenay »

lol

aber mal im ernst: bei mir produziert die eingabe von set -x und dann der skriptaufruf einen anderen output, als wenn ich als interpreter bash -x angebe. Vielleicht spuken bei mir ja noch heimlich andere variablen rum?!

Jochen

Re: Shell-Script Erzeugen einer Datei-Liste

#7 Post by Jochen »

Hm, ich denke nicht. "set -x" setzt die Option sozusagen nachträglich <i>für die Shell, die das set-Kommando ausführt.</i> Man kann also in einem Skript Bereiche mittels "set -x" und "set -" eingrenzen, die man genauer betrachten will (oder mit "set -v" und "set -", wenn man nicht sehen will, was die Shell startet, sondern wie die Kommandos direkt im Skript stehen).

Wenn Du jetzt in Deiner Login-Shell "set -x" ausführst, gilt das für eben diese, aber nicht für die Shell, die dann Dein Skript ausführt. Daher wirst Du nur sehen, dass Dein Skript gestartet wird.

Wenn Du möchtest, dass die Option für Dein Skript gilt, musst Du dort "-x" wieder explizit setzen, ob nun beim Aufruf mittels "bash -x" oder im Skript mittels "#!/bin/bash -x" oder mittels "set -x".

War's das, oder habe ich Dich missverstanden?

hugenay

Re: Shell-Script Erzeugen einer Datei-Liste

#8 Post by hugenay »

yup, habe mal wieder was mit der umgebungsvererbung durcheinander geworfen, klar man muss set -x ja dann im skript setzen.
gruss hug.

marcdevil

Re: Shell-Script Erzeugen einer Datei-Liste

#9 Post by marcdevil »

ich hab mir das script nicht naeher angeschaut, aber zum Dateilisten erstellen mache ich immer:
find ./ -type f -exec du -sh {} ;<!--no--> > Filelist

marcdevil

Re: Shell-Script Erzeugen einer Datei-Liste

#10 Post by marcdevil »

vor dem ; > Filelist steht noch ein \

Post Reply