Archiv verlassen und diese Seite im Standarddesign anzeigen : Files suchen & bearbeiten
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.
Vielleicht so
for i in `ls /$dir/*.txt`;do
<Behfehl> $i
done
tomes
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.
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
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.