find / sed Frage

Post Reply
Message
Author
Rossi

find / sed Frage

#1 Post by Rossi »

Moin,

habe folgendes Problem:

Ich bin in einem Verzeichnis mit zig Unterverzeichnissen (und Unterunterverzeichnissen). In einigen (vielen) dieser Unterverzeichnisse ist eine Datei namens "Makefile".
Jetzt möchte ich in allen diesen "Makefile" jede Dateien http durch ftp ersetzen.

"find . -name Makefile -exec 'cat {} | sed s/http/ftp/g' ;<!--no-->" klappt nicht. Neben einem mysteriösen Syntaxfehler (find: cat /Pfad/Makefile | sed s/http/ftp/g: No such file or directory) werden die Dateien mit sed ja auch nur ausgegeben und nicht geändert.

Jemand ne Idee ?

P.S.: Ich gebe zu, es handelt sich um den FreeBSD Ports Tree, aber das problem ist nicht absolut nicht FreeBSD spezifisch, weshalb es auch hier nicht Off Topic ist.

Jochen

Re: find / sed Frage

#2 Post by Jochen »

Erst mal zum Syntax-Fehler: Da Du um das find/sed-Konstrukt Hochkommata ('') setzt, wird die ganze Zeichenkette als ein einziges "Argument am Stück" dem -exec als Kommando zur Ausführung gegeben. Und ein Kommando mit Namen "cat {} | sed s/http/ftp/g" gibt es halt wirklich nicht!

Zur in-place-Ersetzung verwende ich mittlerweile am liebsten perl, weil man sich sonst Gedanken um Zugriffsrechte und Eigentümer der neuen Dateien machen muss. Mein Kommando sähe wie folgt aus:<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
perl -p -i.bak -e 's/http/ftp/g' $(find . -name Makefile)
</font><hr></pre></blockquote>
Statt $(...) darfst Du natürlich auch `...` verwenden, wenn Du keine bash/ksh verwendest. find liefert die Dateinamen als Argumente zu perl, welches in jeder Datei inline (-i.bak) sämtliche Zeilen durchackert und diese auch ausgibt (-p), nachdem es ein substitute-Kommando ausgeführt hat (-e '...'). Zur Sicherheit wird zuerst ein Backup mit der Endung ".bak" angelegt.

OK so?

Skript-Jochen

Rossi

Re: find / sed Frage

#3 Post by Rossi »

perl: Argument list too long

Haut noch nicht ganz hin, aber die Richtung stimmt :) Sieht so aus, als ob er erst alle Makefiles durchackert und dann mit der Substitution beginnen will, was bei 6000+ Makefiles ein Problem sein könnte ?!

Jochen

Re: find / sed Frage

#4 Post by Jochen »

Na ja, 6000+ Files sind vielleicht <i>etwas</i> viel auf einmal... <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

Macht aber nix, xargs (siehe auch <a href="http://www.pl-berichte.de/t_shell/xargs.html" target="_blank"><!--auto-->http://www.pl-berichte.de/t_shell/xargs ... <!--auto--> ) hilft weiter:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">find . -name Makefile -print | xargs perl -p -i.bak -e 's/http/ftp/g'</font><hr></pre></blockquote>
find pipet dann die Namen zu xargs, der daraus Argumentlisten für das perl-Kommando erstellt, die gerade noch passen.

Besser?

Jochen

Rossi

Re: find / sed Frage

#5 Post by Rossi »

Jochen: Du wirst hiermit einstimmig zum Pro-Linux Servicemitarbeiter des Monats gekürt !!!

Soweit ich das sehen kann, hat alles hingehauen.

Jochen

Re: find / sed Frage

#6 Post by Jochen »

<img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle"> Schön zu hören. Viel Spass noch!

Jochen

Jochen

Re: find / sed Frage

#7 Post by Jochen »

<img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle"> Schön zu hören. Viel Spass noch!

Jochen

Post Reply