androxin
Goto Top

In For-Schleife nach Dateiinhalt Filtern

Guten Tag,

ich habe ein Shellscript, welches Dateien, die max. 30 Tage alt sind, aus einem definierten Verzeichnis ausliest, deren Inhalt parst und anschließend als XML in eine PHP Datei einbettet und auf einen FTP Server lädt. Nun habe ich das Problem, dass in diesen Dateien hardwarebedingt vereinzelt vermurkste Zeichen auftauchen, die später vom Webserver beim Zerlegen der XML Daten nicht gelesen werden können. An der Ursache kann man leider nichts ändern und fehlerhafte Inhalte sollen gar nicht erst zum Server gelangen. Ich möchte nun also fehlerhafte Dateien einfach in der for-Schleife ignorieren.

Wie kann man die "in" Bedingung so erweitern, dass alle Dateien, die auch Zeichen außerhalb des ASCII Zeichensatzes (Buchstaben, Ziffern, Sonderzeichen, Zeilenumbrüche) enthalten, rausfallen?
Bei einem Durchlauf werden rund 30 Dateien verarbeitet und das Script wird alle 1-2 Minuten ausgeführt.


Sinnvoll gekürzte Version des Scripts:
#!/bin/bash

UPDIR="/tmp"  
XMLFILENAME=test.php

ANZAHL=0
ZEITSPANNETAG=30



erstelle_xml() {

  for FILE in $( find $DIR -mtime -$ZEITSPANNETAG ); do
	ANZAHL=$((ANZAHL+1))
	echo "<message>" >> $UPDIR/$XMLFILENAME  
    
	echo "<date>" >> $UPDIR/$XMLFILENAME  
	grep Datum: $FILE | sed 's/Datum://g' | sed 's/^ \+//g' >> $UPDIR/$XMLFILENAME  

    echo "</message>" >> $UPDIR/$XMLFILENAME  

  done
  
}

Content-Key: 230491

Url: https://administrator.de/contentid/230491

Ausgedruckt am: 29.03.2024 um 02:03 Uhr

Mitglied: Endoro
Endoro 20.02.2014 um 14:34:41 Uhr
Goto Top
Hey,

du kannst doch einfach mit grep prüfen, ob irgendwelche Zeichen ausserhalb einer definierten Menge in der Datei vorhanden sind.

Gruss.
Mitglied: Androxin
Androxin 21.02.2014 um 12:24:04 Uhr
Goto Top
Zitat von @Endoro:

du kannst doch einfach mit grep prüfen, ob irgendwelche Zeichen ausserhalb einer definierten Menge in der Datei
vorhanden sind.

Ja, so habe ich mir das auch schon gedacht.

Also das find auf diese Art zu ergänzen:
find $DIR -mtime -$ZEITSPANNETAG -exec grep -l --regexp='[a-z........]*' {} \;

Allerdings stehe ich gerade auf dem Schlauch, was die Formulierung des Ausdrucks angeht.

Eine Datei mit fehlerhaftem Zeichen (hier dargestellt durch µ ) könnte so aussehen:
Hallo <1*2 3>
Fµo
oder so:
Hallo fµo
oder so:
*µµµ*

Wie kann ich den Ausdruck so formulieren, dass die drei genannten Bsp aus der Dateiliste rausfallen, weil die ja mindestens einen falschen Wert enthalten?
Mitglied: Endoro
Endoro 21.02.2014 um 13:23:28 Uhr
Goto Top
Definiere einfach alle Zeichen, die auftreten dürfen, in einer Menge. Dann nimm die Negation der Menge. Beispiel:
grep -El '[^[:alnum:][:space:]!#$%&*+.:-]'  
Mitglied: Androxin
Androxin 21.02.2014 um 13:57:40 Uhr
Goto Top
Zitat von @Endoro:

Definiere einfach alle Zeichen, die auftreten dürfen, in einer Menge. Dann nimm die Negation der Menge. Beispiel:
grep -El '[^[:alnum:][:space:]!#$%&*+.:-]'  

Sehr cooler Ansatz. Funktioniert so aber leider noch nicht. face-sad
Ich habe den Ausdruck wie folgt erweitert. Leider wird nicht eine einzige Datei zurückgegeben, obwohl fehlerhafte und korrekte von Find gefunden werden.

find $DIR -mtime -$ZEITSPANNETAG -exec grep -L --regexp='[^[:alnum:][:space:][:punct:]!#$%&*+.:-]' {} \;  
Mitglied: Endoro
Endoro 21.02.2014 um 14:51:17 Uhr
Goto Top
Zum einen musst du wahrscheinlich die Menge der Zeichen erweitern, zum anderen kenne ich diese Konstruktion mit exec nicht. Ich habe keine Ahnung von bash aber hab es bislang immer mit Pipe gesehen.
Gruss.