ubuntuusers.de

Strings in mehreren Dateien ersetzen

Status: Ungelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

RIDIoX

Anmeldungsdatum:
28. März 2014

Beiträge: 4

Hallo zusammen

Wir haben eine interne DokuWiki auf einem Ubuntu-Server im Einsatz. Nun hat sich ein Netzwerkpfad geändert, der in sehr vielen Seiten innerhalb der DokuWiki festgehalten ist. Die DokuWiki speichert die Seiten in Unterordner gruppiert als normale Textdateien, weshalb ich nun all diese Seiten gerne per Script abgrasen und alle entsprechenden Pfade innerhalb dieser Textdateien ersetzen würde.

Es sollen also z.B. alle in diesen Textdateien enthaltenen Strings \\serverA\sharename$ in \\serverB\newsharename$ umgeändert werden.

Ich denke dass das via Shell-Script irgendwie möglich sein sollte. Leider bin ich nicht sehr erfahren mit Shell-Scripting.. :-/

Ich habe schon gegoogled und einige Ansätze mit sed gefunden. Jedoch beziehen sich all diese Beispiele auf das durchsuchen einer einzelnen Datei, und nicht rekursiv auf alle Dateien in allen Unterordner ab einem bestimmten Startknoten.

Ist dies so mit angemessenem Aufwand überhaupt realisierbar? Falls ja, kann mich jemand in die richtige Richtung schubsen? Es würde auch schon reichen wenn ich alle Textdateien innerhalb eines bestimmten Ordners 'bearbeiten' könnte.

Vielen Dank im Voraus!

Lieber Gruss aus der Schweiz Andreas

schusch

Avatar von schusch

Anmeldungsdatum:
2. September 2008

Beiträge: 324

Wohnort: Berlin

1
2
3
4
#!/bin/bash
DIR=Startverzeichnis

find $DIR ! -type d -exec sed -i 's/\\\\serverA\\sharename\$/\\\\serverB\\newsharename\$/g' '{}' \:

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13189

schusch schrieb:

1
2
3
4
#!/bin/bash
DIR=Startverzeichnis

find $DIR ! -type d -exec sed -i 's/\\\\serverA\\sharename\$/\\\\serverB\\newsharename\$/g' '{}' \:

Ein paar Anmerkungen

  • Am Ende muss ein Semikolon oder ein + stehen - kein Doppelpunkt. Ich bevorzuge in diesem Fall "+", da das effizienter ist (es wird ein sed mit mehreren Dateinamen gestartet und nicht einer pro Datei).

  • Anstatt "! -type d" würde ich eher "-type f" nehmen - sonst findet der find auch Sockets etc.

  • Es bietet sich auch an, "-i" mit einer Extension zu verwenden - dann hat man noch ein Backup jeder Datei.

  • Und $DIR sollte natürlich ordentlich mit Quotes versorgt werden.

  • Bei den geschweiften Klammern braucht man keine Quotes.

RIDIoX

(Themenstarter)

Anmeldungsdatum:
28. März 2014

Beiträge: 4

Hallo susch und rklm,

Wow, das ging ja schnell.. ☺ Vielen Dank euch! Ich werde das heute noch versuchen und Rückmeldung geben!

liebe Grüsse

Andreas

RIDIoX

(Themenstarter)

Anmeldungsdatum:
28. März 2014

Beiträge: 4

Hallo Zusammen

Ich konnte das Ganze nun testen. Es hat grundsätzlich gut funktioniert. Jedoch musste ich den Parameter -type d verwenden. Mit -type f wurde nichts ersetzt und ich bekam ich die folgende Meldung:

sed: couldn't edit /var/www/dokuwiki/data/pages/pagexy: not a regular file

Mit + am Ende nur 1x, mit ; am Ende 1x pro Verzeichnis (was einleuchtet, wenn sed für jedes Ergebnis gestartet wird)

Der Grund dafür ist mir allerdings ein Wenig schleierhaft..

Aber seis drum.. Es hat auf jeden Fall schlussendlich geklappt ☺

Ich danke euch nochmal für eure (sehr schnelle!) Hilfe! ☺

lieber Gruss

Andreas

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13189

RIDIoX schrieb:

Hallo Zusammen

Ich konnte das Ganze nun testen. Es hat grundsätzlich gut funktioniert. Jedoch musste ich den Parameter -type d verwenden. Mit -type f wurde nichts ersetzt und ich bekam ich die folgende Meldung:

sed: couldn't edit /var/www/dokuwiki/data/pages/pagexy: not a regular file

Bitte lies noch einmal genau, was ich vorher geschrieben habe.

Mit + am Ende nur 1x, mit ; am Ende 1x pro Verzeichnis (was einleuchtet, wenn sed für jedes Ergebnis gestartet wird)

Der Grund dafür ist mir allerdings ein Wenig schleierhaft..

Dann schau doch einfach mal auf die Manpage von find.

Ciao

robert

RIDIoX

(Themenstarter)

Anmeldungsdatum:
28. März 2014

Beiträge: 4

Hallo rklm,

Sorry, ich hab das wohl etwas unklar geschrieben! Der Grund, wieso mit ; für jedes Ergebnis eine Instanz von sed gestartet wird ist mir klar.

Nicht klar war mir wieso sed Directories editieren will. Aber ich habe tatsächlich deinen Beitrag nicht genau genug gelesen und beim ändern auf -type f die negation (!) dran gelassen, wodurch natürlich nur nach Verzeichnissen gesucht wurde. Da machen die Meldungen plötzlich wieder Sinn ☺
Die Negation habe ich leider noch nicht gekannt. Aber die man-Page hilft weiter ☺

Danke für den Schubs! ☺

lieber Gruss Andreas

Antworten |