Schrift
[thread]9075[/thread]

Anfängerfrage

Leser: 1


<< >> 8 Einträge, 1 Seite
Gast Gast
 2007-06-08 03:11
#77371 #77371
Hallo,
ich hab mir gerade diesen perl-Befehl gebastelt :

perl -i -pe 's/http:%5C/\/www\.zdf\.de/http:%5C/\/www\.ard\.de/g' *.*

Er tauscht den Lind von zdf auf ard in den Dateien.
Wie kann ich diesen Befehl erweitern, das auch die Dateien in den Unterverzeichnissen geändert werden ?

Gruß
Viper64
ptk
 2007-06-08 09:45
#77372 #77372
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
zsh verwenden und den Spezial-Joker ** verwenden :-)
Oder mit "find" arbeiten, z.B. (ungetestet)
Code: (dl )
perl -i pe '...' `find . -type f`
bru
 2007-06-08 11:20
#77373 #77373
User since
2007-06-08
2 Artikel
BenutzerIn
[default_avatar]
zsh hab ich nicht

und bei der Kombination aus perl und find, kommt
die Fehlermeldung :

-bash: /usr/bin/perl: Argument list too long


Wie kann ich das den sonst noch machen? Hab keine Lust in knapp 50 Unterordner mit je nochmal ca. 30 Unterordner manuell zu wechseln.

Für Eure Hilfe schonmal Danke im Voraus

Gruß
Viper64
pq
 2007-06-08 12:06
#77374 #77374
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
benutze find mit xargs.
find ... | xargs perl -pi -we'...'
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
bru
 2007-06-08 13:23
#77375 #77375
User since
2007-06-08
2 Artikel
BenutzerIn
[default_avatar]
Danke, hat funktioniert
Dubu
 2007-06-10 22:24
#77376 #77376
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=pq,08.06.2007, 10:06]benutze find mit xargs.
find ... | xargs perl -pi -we'...'[/quote]
Vorsicht damit, wenn in den Dateinamen Leerzeichen o.ä. vorkommen können. Dafür gibt es die Option, dass find(1) die Dateinamen mit Nullbyte getrennt ausgibt (Option -print0) und xargs(1) sie wieder an Nullbytes trennt (Option -0 ["minus Null"]).
Code: (dl )
find ... -print0 | xargs -0 perl -pi -we'...'
docsnyder
 2007-06-12 14:37
#77377 #77377
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
... oder wie es bei find vorgesehen ist:

Code: (dl )
find . -type f -exec perl -pi -we '...' {} \;

Damit gibt's auch keine Probs von wegen zu viele Args ;o)

Gruß, Uwe
Dubu
 2007-06-12 15:26
#77378 #77378
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
find(1) mit -exec in dieser Form ist ziemlich ineffizient, weil für jedes Ergebnis (also jede einzelne Datei) das Argument in einer eigenen Subshell gestartet wird. Sofern ein GNU find(1) benutzt wird, dass diese Möglichkeit bietet, sollte man statt des \; am Ende ein + notieren. Das bewirkt nämlich, dass das Argument so wenige Male wie möglich, mit der jeweils maximal möglichen Anzahl an Argumenten aufgerufen wird, so wie es auch xargs(1) macht.

xargs(1) hatte ich bisher aber auf mehr Systemen zur Verfügung; die find(1) Variante mit + scheint es noch nicht so lange zu geben.

Du kannst ja mal benchmarken, da liegen Welten zwischen der Lösung mit find ... -exec ... \; einerseits und find ... -exec ... + bzw. find ... | xargs ... andererseits (die letzten beiden sind ziemlich gleich schnell).
<< >> 8 Einträge, 1 Seite



View all threads created 2007-06-08 03:11.