PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shellskript Abfrage Datei vorhanden und Dateigröße



MC3330
23-07-2009, 11:11
Hallo,
ich habe folgendes Shellskript.

for i in `seq 100 200`
!#/bin/sh
do
if test -f /daten05/maltec/input_files_mc/2338/EC_2338_DOY_$i.nc;
then
echo File EC_2338_DOY_$i.nc existiert bereits
else
csi2ncdf -i /daten05/maltec/ts_data/2338/EC_2338_DOY_$i.csv -l -1 -n toa5 | csi2ncdf -i - -t ssv -a -f config_flux_ec.con -o /daten05/maltec/input_files_mc/2338/EC_2338_DOY_$i.nc
echo File EC_2338_DOY_$i.nc geschrieben
fi
done
Es fragt ab ob eine Datei vorhanden ist, und falls die Datei nicht vorhanden ist erstellt es diese Datei neu. Soweit funktioniert auch alles.
Ich würde jetzt diese Ziele

if test -f /daten05/maltec/input_files_mc/2338/EC_2338_DOY_$i.nc;
gerne so verändern das er nicht nur prüft, ob die Datei vorhanden ist, sondern auch prüft ob sie größer als 1064 byte ist.

Ist das irgendwie einfach realisierbar?

msi
23-07-2009, 15:00
ja ist realisierbar! dateigrößen kannst du zB mit du -k erfahren.

MC3330
23-07-2009, 15:16
Kann ich auch verschiedenen Abfragen über "und" "oder" usw verknüpfen?
Kann ich nur nach expliziten größen Fragen, oder geht auch sowas wie größer, kleiner?

DieterH
13-08-2009, 16:33
gerne so verändern das er nicht nur prüft, ob die Datei vorhanden ist, sondern auch prüft ob sie größer als 1064 byte ist.

Ist das irgendwie einfach realisierbar?


Mit Linux/Unix ist alles machbar. Wie bereits MSI (MicroSoft??) erwähnte, ist "du -k" ein Lösungsansatz, allerdings ein erster. Dein Wunsch ist, jede beliebige Dateigröße abzufragen. Der Befehl "du -k" rundet nach kBytes.

Um beispielsweise abzufragen, ob eine Datei größer, kleiner oder genau 1064 Bytes hat, würde ich wie folgt vorgehen:

1. Speichern der Ausgabe von "ls -l datei" in einer Variablen und gleichzeitig die Dateigröße herauslösen (mit "cut" und/oder "sed")
2. Übergabe des gefundenen Wertes an "awk", der mit zwei Parametern gefüttert wird. Der eine Parameter ist die gefundene Dateigröße, der andere der vorgegebene Richtwert (z.B 1064 Bytes).
3. "awk" liefert einen von genau drei benutzerdefinierten Werten zurück, die für "kleiner", "genau", und "größer" bzgl. Dateigröße stehen.
4. Abfragen des von "awk" zurückgelieferten Wertes" für die weitere Verarbeitung.

Da ich am Arbeitsplatz mit Windoze arbeiten muss ("*wein*"), kann ich erst heute abend (evtl. spät abend) Dir eine ausgearbeitete Lösung anbieten.

Gruss
Dieter

PS:
Statt (ausführlich) "if test ..." zu schreiben, würde ich kürzer schreiben:

if [ -f datei ] ; then
statement-true
else
statement-false
fi


Du kannst natürlich in einer "if"-Abfrage mehrere Bedingungen abfragen:
if [ -f datei 1 -a -d verzeichnis ] ; then (für "AND")
if [ -f datei 1 -o -d verzeichnis ] ; then (für "OR")

Die langen Zwischenräume dienen nur der optischen Abgrenzung.
Du kannst auch andere Kriterien in "if" angeben.

MC3330
13-08-2009, 16:50
Halllo,

danke für die ausführliche Antwort.
Ich habe mir mittlerweile was zusammen gebastelt, dass ich erst wie hier beschrieben abfrage ob die Datei existiert und dann per Awk die Größe auslese und die noch mal mit einer Bedingung Abfrage ob sie kleiner als meine Grenzgröße ist.

Das geht aber bestimmt auch eleganter. Ich werde morgen wenn ich auf der Arbeit bin mal meine Lösung hier reinposten.

Wie das geht mehrere Abfrage mit "und" oder "oder" zu kombinieren bin ich noch nicht hintergestiegen. Das muss ich auch noch mal rausbekommen.

Gruß Malte

DieterH
13-08-2009, 20:58
Wie das geht mehrere Abfrage mit "und" oder "oder" zu kombinieren bin ich noch nicht hintergestiegen. Das muss ich auch noch mal rausbekommen.


Wie bereits skizziert:

if [ bedingung1 -a bedingung2 -a bedingung3 ] ; then (für z.B. 3 Bedingungen, die mit AND verknüpdt sind.

if [ bedingung1 -o bedingung2 ] ; then (für z.B. 2 Bedingungen, die mit OR verknüpft sind)

Für bedingung1, bedungung2, usw setzt Du jeweils eine beliebige syntaktisch korrekte Bedingung ein (aus Auswahlliste (Auszug)):

-f ${DATEI}: ist Datei ${DATEI} vorhanden
-s ${DATEI}: ist Datei ${DATEI} vorhanden UND hat eine Größe von mindestens einem (1) Byte
-d ${VERZ}: ist Verzeichnis ${VERZ} vorhanden
${ZAEHLER} -eq 14: Ist der Wert der Variablen ${ZAEHLER} genau 14
${ZAEHLER} -lt ${MAX_ABC}: Ist der Wert Variablen ${ZAEHLER} kleiner als der Wert der Variablen ${MAX_ABC}

Man kann auch Negationen testen, das geschieht bei "-f" und "-d" mit vorangestelltem Ausrufezeichen:
! -f ${DATEI}
! -d ${VERZ}

Mit diesem Lego-Baukasten bauen wir nun eine (i.a. nicht sinnvolle) Mehrfachbedingung:

if [ ! -d ${MYFILE} -a ${LOOP_COUNT} -gt ${MAX_LOOP_COUNT} ] ; then