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.
find / sed Frage
Re: find / sed Frage
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
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
Re: find / sed Frage
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 ?!
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 ?!
Re: find / sed Frage
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
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
Re: find / sed Frage
Jochen: Du wirst hiermit einstimmig zum Pro-Linux Servicemitarbeiter des Monats gekürt !!!
Soweit ich das sehen kann, hat alles hingehauen.
Soweit ich das sehen kann, hat alles hingehauen.
Re: find / sed Frage
<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
<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