PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bash: Wildcard-Auflösung bei Parameterübergabe



tuNIxM1TUniX
08-08-2004, 22:52
Hallo,
schönes Wochenende gehabt? :cool:

Ich habe noch eine weitere Frage. Das Problem: Ich habe ein Skript, dieses rufe ich auf mit "skript /verzeichnis/*". Im Verzeichnis liegen über 100 Dateien. Mein Skript hört nach etwa 50 Dateien mit der Bearbeitung auf (Fehlercode 0, also ok).

Frage: Warum?
Bessere Frage: Wie kann ich das Skript/die Bash dazu bewegen, alle Dateien einzulesen?

Habe schon versucht, die Eingabe zu puffern (Skript schreibt sämtliche Parameter (nach der Abarbeitung von 'getopt', wenn's interessiert) in eine temp. Datei), das ändert aber genau gar nichts am Sachverhalt.

Gruß

Hans-Georg Normann
08-08-2004, 23:03
hmm, was soll das script denn machen? Könnetst du soetwas in dieser Art aufbauen?
find /pfadangabe -name SUCHMUSTER -exec deinshellscript.sh "{}" \; {} wird hierbei durch den aktuellen Dateinamen mit absolutem Pfad ersetzt.

Hans

tuNIxM1TUniX
09-08-2004, 00:53
Hallo Hans-Georg, perfektes Timing mal wieder ;)

das Skript ist nichts Großes. Ein Interface für die verschiedenen Archiv-Tools (gzip, bzip2, zip, rar etc.).

" find /pfad/ -type f -print0 | xargs -r0 -- skript.sh " tut es nicht. Deine Variante schon, aber das ist ja nicht der Sinn der Sache, weil dabei das Skript bei jedem Fund neu gestartet wird...

Ich habe zu Testzwecken 2 Verzeichnisse angelegt, in A sind genau 165 Archive - davon werden genau 61 abgearbeitet, in B sind ca. 1500, davon werden genau 42 bearbeitet ( :eek: ). Bei jedem weiteren Aufruf wird genau ein Archiv bearbeitet (wenn der Parameter gesetzt ist, vorhandene Dateien zu ignorieren; beim Überschreiben kommt es jedes Mal bis zu der genannten Grenze).

Ist vielleicht der Bash-Puffer zu klein? Wie gehen "richtige" Programme damit um? 'rm' beispielsweise ist es ja egal, wieviele Dateien sich hinter * verbergen... :confused:

peschmae
09-08-2004, 07:40
Ein kleines Testscript:


#!/bin/bash
echo $*


gibt bei mir auf jeden Fall alle 10'000 Dateien im Verzeichnis aus. Allerdings hab ich die nicht einzeln überprüft ;)

MfG Peschmä

tuNIxM1TUniX
09-08-2004, 11:24
Hab es nochmal überprüft: Es landen tatsächlich alle Dateien im erwähnten temp. File. Dieses lese ich aus mit

while read arg ; do
something
done < tempfile

(der Parameter '-r' für 'read' ändert nichts)

Woran könnte es noch liegen?

Hans-Georg Normann
09-08-2004, 19:09
Modifizier doch einmal deinen Code wie folgt:
cp /dev/null /tmp/x.bak
while read arg ; do
echo $arg >> /tmp/x.bak
done < tempfile
Wie weit kommt dein Script? Wenn es durchläuft, muß es mit tempfile identisch sein. Ich vermute fast einen Fehler in dem Code, den du mit something angegeben hast.

Alternative: Du kannst die Ausgabe von find ja auch in eine Datei (tempfile) umlenken. Da find absolute Pfade ausgibt, hast du dann die Bedingung: ein Zeile entspricht genau einer Datei.

Oder verwendest du eventuell Auch Dateinamen mit White Spaces (Leerzeichen) oder Sonderzeichen?

Hans

tuNIxM1TUniX
10-08-2004, 14:47
Ok, ok... Auch while-read reicht alles korrekt durch (auch die Whitespaces).
Schade eigendlich, wär so schön einfach gewesen, die Schuld der Bash in die Schuhe zu schieben. ;)
Gut. Ich werde mich mal eingehend mit dem xtrace von "something" beschäftigen.

Nochmals Danke für die Hilfe, die Fehlerquelle einzugrenzen! :)

Gruß