Hallo, ok, dann mal für die versammelte Mannschaft ;) Am Fri, 13 Jan 2012, ?l ??gn?r schrieb:
Am Fr, 13 Jan 2012 17:58:58 CET schrieb David Haller: kannst du das ein wenig erklären, ich habe es auch nicht ganz verstanden bzw. bin mir nicht sicher, was ich da noch ändern muss. Es geht um tausende avi-Schnipsel von ein paar Sekunden aus einem Camcorder.
Klar.
Ich stelle mir simpel vor, das Script 2x aufzurufen und einmal wird die eine Hälfte und mit dem anderen Script die andere Hälfte aufgerufen. Es soll bewusst nur 1 Kern verwendet werden.
==== #!/bin/sh exec 3>&1
Warum die Umleitung?
Damit das erste sed am zweiten vorbei auf stdout schreiben kann.
seq 20 | {
Muss die Anzahl genau bestimmt sein oder könnte man einfach 10000 nehmen? Die Anzahl ist aber sowieso schon in einer Variable.
Da kommt dein 'find' hin.
tee /dev/stderr | \
warum nach stderr?
Damit die Ausgabe von find bei beiden sed landet.
sed -n '1~2p' | xargs echo "job1: " >&3 ; } 2>&1 | sed -n '2~2p' | xargs echo "job2: "; ====
job1: 1 3 5 7 9 11 13 15 17 19 job2: 2 4 6 8 10 12 14 16 18 20
So wie ich das verstehe, holst du einfach die geraden und ungeraden Zahlen aus "seq" raus.
Nein. Ich hole jew. die gerade bzw. ungerade Zeile raus. Jetzt nochmal im kommentierten Kontext: exec 3>&1 ### dupliziere stdout (das _aktuelle_) auf fd 3 exec 4>&2 ### dupliziere stderr (das _aktuelle_) auf fd 4 find . -type -f -name '*.avi' | ### oder wie die Dateien eben heißen { ### shell-block auf tee /dev/stderr | ### dupliziere die find-Ausgabe nach stderr sed -n '1~2p' | ### filtere aus find-Ausgabe auf stdout die ### ungeraden Zeilen aus xargs -n 1 dein_script 2>&4 >&3 ; ### und diese einzeln an dein ### Script verfüttern ### ACHTUNG: FEHLER von mir: 2 muß hier zum ### duplizierten stderr, sonst landet das ### beim 2ten sed, siehe [1] mit nem ### modifizierten test-script ### durch die Umleitung 2>&4 landen ### evtl. Fehlermeldungen vom sed/xargs auf ### dem originalen stderr (der Konsole). } 2>&1 \ ### hier das die von tee auf stderr ### duplizierte find-Ausgabe auf stdout umleiten | sed -n '2~2p' | ### die dann an sed verfüttern das die ### geraden Zeilen ausfiltert xargs -n 1 dein_script ### und diese ebenfalls an einzeln an ### dein Script verfüttern Nochmal ein Beispiel: $ touch $(seq 20) $ echo 'echo "$0" > $1' > job1.sh $ echo 'echo "$0" > $1' > job2.sh Die 2 unterschiedlichen job?.sh Scripte nur, damit nachvollziehbar wird, welche Datei von welchem "Job" bearbeitet wurde. ==== temp_test.sh ==== exec 3>&1 exec 4>&2 find . -type f -name '[0-9]*' | { tee /dev/stderr | \ sed -n '1~2p' | xargs -n 1 sh job1.sh 2>&4 >&3 ; } 2>&1 | sed -n '2~2p' | xargs -n 1 sh job2.sh ==== $ ls [0-9]* | sort -n| while read f; do echo "$f: $(<$f)"; done 1: job1.sh 2: job2.sh 3: job1.sh 4: job2.sh 5: job1.sh 6: job2.sh 7: job1.sh 8: job2.sh 9: job1.sh 10: job2.sh 11: job1.sh 12: job2.sh 13: job1.sh 14: job2.sh 15: job1.sh 16: job2.sh 17: job1.sh 18: job2.sh 19: job1.sh 20: job2.sh Wie gesagt, das 'job1.sh'/'job2.sh' dient nur dazu, daß man sieht von welchem Aufruf via xargs -n 1 die jew. Datei bearbeitet wurde. Die Ausgabe von 'find' wird also zu 50:50 auf die beiden "Job.sh" Aufrufe verteilt (plus ggfs. Überhang bei unterschiedlichen Laufzeiten und ungerader Anzahl Dateien ;) HTH, -dnh, hoffend alle Unklarheiten beseitigt zu habend [1] ==== exec 3>&1 exec 4>&2 seq 20 | { tee /dev/stderr | \ sed -n '1~2p' | xargs ls "job1: " >&3 ; } 2>&1 | sed -n '2~2p' | xargs echo "job2: "; ==== $ sh ~/test.sh job2: 2 4 6 8 10 12 14 16 18 20 ls: cannot access 1: No such file or directory ls: cannot access 5: No such file or directory ls: cannot access 9: No such file or directory ls: cannot access 13: No such file or directory ls: cannot access 17: No such file or directory -- "The command 'man man' works fine, but 'man woman' produces: No manual entry for woman." -- Constantinos Maltezos -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org