Linux 15.036 Themen, 107.107 Beiträge

sed im Verzeichnisbaum

edico / 6 Antworten / Baumansicht Nickles

Hej,

Wie kann ich sed rekursiv für alle HTML-Dateien in allen SUBs (aller DIRs) anwenden? Es geht darum, die Pfade von HTML-Files (einer Bibliothek) Windows-like zu transferieren und Links und Verweise anzupassen.

Für ein bestimmtes (Working-)DIR schauts so aus (positiv):
for i in *.html; do
sed \'s#/home/ds#file:///e:#\' $WORKDIR/$i > $WORKDIR/filetmp;
mv $WORKDIR/filetmp $WORKDIR/$i;
done

Um alle SUBs im DIR (bzw. mehreren DIRs) anzuspringen, muss ich wohl irgendwie den TREE abarbeiten:

$ for f in ???; do
for i in *.html; do
sed ...
done
done

Was steht für ??? - muss ich mir eine SUB-Liste erstellen (wie wäre das dann) ... oder laufe ich in die falsche Richtung und gibts da was schnuckeliges Einfaches?

Danke. edico

bei Antwort benachrichtigen
Klaus_T edico „sed im Verzeichnisbaum“
Optionen

Klar, gibt immer etwas einfaches. Nimm find:

find / -name '*.html' -exec sed... {} \;

die schnellere unf bessere Variante:

find / -name '*.html' -print0 | xargs -0 sed...

Bye, Klaus

bei Antwort benachrichtigen
edico Nachtrag zu: „sed im Verzeichnisbaum“
Optionen

Hej Klaus,

ja, der Tip ist gut. An find war ich auch schon dran (xargs ist leider noch ein weisser Fleck bei mir), habs dann wieder verworfen, muss aber noch mal gründlich drüber nachdenken.

Ja, das könnte hinhauen. Ich habe gerade die schon geschriebenen Zeilen, um deinen Ansatz zu «zerreissen», alle wieder gelöscht. Ich werde da mal weitermachen und mein Script grundlegend umgestalten! Wenn ich nicht weiterkomme, rühre ich mich noch mal.

Gruss an Baldeney.
Danke. edico

bei Antwort benachrichtigen
edico Nachtrag zu: „sed im Verzeichnisbaum“
Optionen

Hej Klaus,
doch schneller zurück als gedacht. Ich bekomme das vermutlich hin!

$ find $WORKDIR -name '*.html' -exec sed 's#/home/ds#file:///e:#' {} \;
$ find $WORKDIR -name '*.html' -print0 | xargs -0 sed 's#/home/ds#file:///e:#'

Ich komme aber noch nicht zu Potte, wie ich die Änderungen in den jweiligen File zurückschreibe und nicht nur aufm Screen habe!? Gilt für beide commands. Welche Umleitung muss ich da machen? Ich sehe wieder den Wald vor lauter Bäumen nicht!
Danke. edico

bei Antwort benachrichtigen
Klaus_T edico „Hej Klaus, doch schneller zurück als gedacht. Ich bekomme das vermutlich hin!...“
Optionen

Mmh, dann andersherum:

for i in `find / -name '*.html'`; do sed... >$i ;done

Fummel da mal etwas mit rum.

Klaus

bei Antwort benachrichtigen
edico Klaus_T „Mmh, dann andersherum: for i in find / -name .html do sed... i done Fummel da...“
Optionen

Hej Klaus,
ok, richtig, fummeln - die Schleife bindet so noch nicht.
Danke.edico

bei Antwort benachrichtigen
edico Nachtrag zu: „sed im Verzeichnisbaum“
Optionen

Hej
@Klaus: für deine Bibliothek
@alle: die es interessiert

die Lösung sieht so aus:
for i in `find $WORKDIR -name '*.htm*'`; do
sed 's#/home/ds#file:///e:#' $i > $i.bak;
mv $i.bak $i;
done

Danke.edico

bei Antwort benachrichtigen