[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Skriptfrage: Textdateien bearbeiten



Andre Tann <atann@alphasrv.net> (Mi 02 Jan 2013 14:30:38 CET):
> Heiko Schlittermann, Mittwoch, 2. Januar 2013: 
> > Andre Tann <atann@alphasrv.net> (Mi 02 Jan 2013 13:35:40 CET):
> > > Hallo zusammen,
> > > 
> > > mal ne blöde Frage: warum funktioniert folgendes:
> > >    find . -name 'dovecot-acl' -print0 | \
> > >    
> > >       xargs -i -0 sed -i 's_user1_user2_' {}
> > > 
> > > Folgendes aber nicht:
> > >    find . -name 'dovecot-acl' | while read i; do \
> > >    
> > >       echo sed -i 's_user1_user2_' "$i"; done
> > 
> > Hängt das wirklich, oder nur, wenn Du das „echo“ wegläßt?
> 
> Tschuldigung, das echo hab ich nur rein, um zu sehen, was da passiert,
> und hab dann die falsche Zeile kopiert.
> 
> Die Kette sah ursprünglich so aus:
> 
> find… | while read x; do sed … "$x"; done
> 
> 
> > Versucht vielleicht „sed“ etwas von STDIN zu lesen?  (Sieht in der Zeile
> > oben allerdings nicht so aus.)
> 
> Tja, wie krieg ich das raus? 

Mit ps beobachten, es müsste ja immer ein anderer sed-Prozess laufen.
Und wenn nicht, kann man den einen, der da sein müsste, mit „strace“
anschauen. Und mit „lsof“.

> > Ich vermute, die präsentierte Zeile ist nicht wirklich die, die Du
> > verwendest.
> 
> Doch, siehst Du am echo ;) Es war wirklich copy&paste, und dann hab ich
> noch die Usernames geändert.
> Ich hab ziemlich lange gewartet, vielleicht 20 Minuten oder so, und in
> der Zeit ist weder was passiert, noch war die Systemlast angestiegen. Es
> gibt insgesamt 
> 
> # find . -iname dovecot-acl | wc -l
> 5967
> 
> Das dürfte nicht so arg lange dauern.

Nein. Ich habe hier mal 6000x sed aufgerufen:

$ time for i in {1..6000}; do sed -i 's_a_b_' a; done
 real    0m16.514s
 user    0m0.388s
 sys 0m2.548s

In der Datei „a“ sind knapp 50 Zeilen. Bei knapp hundert Zeilen braucht
es 19 Sekunden. (Normaler Laptop, QuadCore mit 1.2GHz, 4GB RAM).

Das ist alles ein lokales Dateisystem?

> Ich hab das grad mal durchlaufen lassen, und stelle etwas erstaunt fest,.
> daß es über 4 Minuten dauert, bis das ausgeführt ist. Dabei ist jede der
> Dateien nur ein paar Zeilen lang, und 6000 Dateien sind jetzt nicht die
> Welt.
> Vielleicht ist meine Konstruktion aus find | while…; do sed; done
> einfach wirklich schnarchlangsam, und ich hätte einfach länger warten
> sollen?

Glaube ich nicht wirklich. Siehe oben.
 

-- 
Heiko

Attachment: signature.asc
Description: Digital signature


Reply to: