PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Files suchen & bearbeiten



petzi
25-10-2004, 16:48
Hallo,

ich hab echt ein Problem mehrere Files zu bearbeiten.

Also konkret - ich durchsuche zuerst ein Verzeichnis, ob Files mit einer gewissen Endung (z.B. text) im Verzeichnis existieren -- funktioniert wunderbar.

und anschliessend muss ich mit jedem File, div. Oracle Procedures etc. durchführen.
AWA das funktioniert net so richtig...kann mir jemand nen Tipp geben,
wie ich die 2. Schleife machen muss (SORRY...für die Frage...)

DANKE.

fork
25-10-2004, 18:15
Was hast'n bis jetzt so?

tomes
25-10-2004, 18:43
Vielleicht so

for i in `ls /$dir/*.txt`;do
<Behfehl> $i
done


tomes

petzi
26-10-2004, 07:45
hi,

danke.

also bei mir siehts so aus...

for i in 'ls a1 $dir | grep txt';
do
echo $i
# und nun sollten für alle gefunden files sqlplus und div. andere funktionen aufgerufen werden. aber ich erhalte immer die Meldung

--> unexpected end of file, am ende des files.

done

Danke für Eure Hilfe.

fork
26-10-2004, 13:06
Hi Petzi,

ein paar Sachen vorweg(Ich glaub' da wär auch mal'n Hinweis in der FAQ fällig)

Wenn du Code hier rein stellst nimm bitte die [ code ] Tags. Das erhöht die Lesbarkeit enorm(Ich seh' allerdings gerade das da gar nix zum Klicken da ist. Muss man per Hand schreiben. Siehe vb-Code Hilfe (http://www.mrunix.de/forums/misc.php?do=bbcode)
Ich empfehle statt `...`lieber $( ... ) zu nehmen, ist zwar nicht kompatibel zur Ur-Bourne-Shell aber wesentlich weniger fehleranfällig
Nimm einen Editor mit Syntaxeinfärbung(SciTE,glimmer,kwrite,nedit,vim,.. .). Dann siehst Du einige Fehler sofort


--> unexpected end of file, am ende des files.

Das deutet auf einen Syntaxfehler hin, möglicherweise auch ein fehler aufgrund eines ungewhöhnlichen Dateinamens(Der Quotingzeichen wie ' oder ` oder " oder auch andere störende Metazeichen enthält.
Weiterhin solltest Du um dem Vorzubeugen Variablennamen in Anführungszeichen setzen. "so" Sonst stören auch bereits enthaltene Leerzeichen und Tabs im Dateinamen.

Shell Option -x
Die Shell Option -x sorgt dafür das Befehle nach der Interpretation(Variablen, Unterkommandos, ... ) aber unmittelbar vor der Ausführung noch mal ausgegeben werden. Die Option wird mit set -x gesetzt und set +x wieder aufgehoben. Das set -x muss im Script stehen.

Hans-Georg Normann
27-10-2004, 21:21
hi,

danke.

also bei mir siehts so aus...

for i in 'ls a1 $dir | grep txt';
do
echo $i
# und nun sollten für alle gefunden files sqlplus und div. andere funktionen aufgerufen werden. aber ich erhalte immer die Meldung

--> unexpected end of file, am ende des files.

done

Danke für Eure Hilfe.Also ich würde ein Script schreiben, welches den Dateinamen als Parameter mitbekommt. Ich nenne das mal DEINSCRIPT.sh

#!/bin/sh
DATEINAME = $1
..........
und dann ganz einfach
find . -name "*.txt" -exec DEINSCRIPT.sh {} \;
#alternative wenn >Gross- Kleinschreibung der Dateinamen ignoriert werden soll
find . -iname "*.txt" -exec DEINSCRIPT.sh {} \;Beachte, dass das -exec in der Shell unbedingt mit \; abgeschlossen werden muss. {} gibt den Dateinamen aus.

Hans

petzi
28-10-2004, 14:11
Danke für die Tipps.

es funzt eh schon - hab halt vergessen das ich die oracle sqlplus in
`` setzen muss, damit's ausgeführt werden.

THX.

RapidMax
28-10-2004, 23:08
Verbesserungsvorschlag statt:

for i in 'ls a1 $dir | grep txt'
Direkt mit Shell-Expansion der Dateinamen arbeiten:

for filename in a1 ${dir%/}/*.txt
"filename" anstelle von "i" ist aussagekräftiger. ${dir%/} anstelle von $dir entfernt den Slash am Ende der Variable $dir, falls vorhanden (sonst hast du /home/foo//bar.txt).

Hinweis zu find: Es ist zu berücksichtigen, dass find reqursiv den Verzeichnisbaum hinabsteigt, während ${dir}/*.txt nur das Verzeichnis listet. Je nach Anwendung ist das eine oder andere gewünscht.

Hinweis zu set -x: Wer zu faul ist set -x in das Script zu schreiben kann das Script auch mit "sh -x script.sh" aufrufen.

Gruss, Andy

Blackhawk
29-10-2004, 11:18
man bedenke auch, dass expansion mit dem * nicht fuer generische Scripte zu verwenden ist, da es bei zu vielen Dateien nicht mehr funktioniert...

peschmae
29-10-2004, 16:11
Sicher? Bei mir geht das auch mit 15000 Dateien mit jeweils 20 Zeichen langen Dateinamen bestens. Habs eben getestet.

Allerdings geht sowas nur mit for-Schleifen gut. Ein "rm *" mit so vielen Dateien schlägt fehl währenddem ein "for f in *; do rm $f; done" trotzdem noch geht.

MfG Peschmä

Hans-Georg Normann
29-10-2004, 19:30
Hinweis zu find: Es ist zu berücksichtigen, dass find reqursiv den Verzeichnisbaum hinabsteigt, während ${dir}/*.txt nur das Verzeichnis listet. Nicht wenn die die Option -maxdepth verwendest.

-maxdepth Ebenen
steigt bis zu der gegebenen Zahl von Ebenen im Verzeichnisbaum auf (in der Hierarchie ab); bei 0 Ebenen werden die Tests nur auf die in der Kommandozeile übergebenen Dateien und Verzeichnisnamen angewendet Hans