[Bash] Mit find und sed viele html-Dateien editieren

erik s.

Erfahrenes Mitglied
Servus und guten Morgen,

ich habe ein wahrscheinlich nicht seltenes Anliegen, zu dem ich allerdings bisher nicht die Lösung gefunden habe, die ich erwartete.
In einem Webseiten-Archiv befinden sich rund 3'700 html-Dateien, welche eine Passage in sich führen, die ich gern loswerden möchte. Es handelt sich dabei lediglich um ein paar Wörter, die immer identisch sind (beispielsweise "REPLACE ME").
Ich ging bisher davon aus, dass sich das Ganze mittels eines Einzeilers lösen lässt. Jedoch schlugen alle Versuche fehl :-/
Mein erster Versuch, die Dateien "in place" zu bearbeiten
Code:
find . -iname "*.html" -exec sed -i 's/REPLACE ME/ /g' {} \;
gab folgende Fehlermeldung zurück:
Code:
sed: preserving permissions for `./sedkp4L98': Die Operation ist nicht erlaubt
Das ist nur die Meldung der ersten gefundenen Datei. Die folgenden sehen ähnlich aus. Ich verstehe auch nicht, wo die Bezeichnung "sedkp4L98" als Dateiname herkommt. Zugriffsrechte sind alle okay, das Ganze spielt sich auf meinem lokalen Rechner in einem gemounteten Verzeichnis ab.

Dann habe ich versucht, die veränderten Inhalte nicht mehr "in place", sondern in eine neue Datei nach dem Muster "<Original-Dateiname>.edited" zu speichern.
Code:
find . -iname "*.html" -exec sed 's/REPLACE ME/ /g' {} \> {}.edited \;
und
Code:
find . -iname "*.html" -exec sed 's/REPLACE ME/ /gpw {}.edited' {} \;
geben mir jeweils nur den Inhalt auf der Konsole aus, erstellen die Dateien und lassen sie aber leer.
Wenn ich den Backslash vor dem Ausgabe-Oprator ">" im oberen Befehl weglasse, schreibt er alle Inhalte in die selbe Datei, nämlich in "{}.edited". Demnach scheint der find-Befehl die Ausgabeumleitung nicht mehr zum exec-Parameter dazuzuzählen.

Gibt es eine Lösung, ohne ein Skript schreiben zu müssen? Das wäre nun nicht schlimm, dafür habe ich auch mehr als genug Beispiele gefunden. Mein Ehrgeiz hat mich nur dazu verleitet, das Problem so anzugehen :)

Vielen Dank schon mal.

Gruß
Erik
 
Hi,

sed: preserving permissions for `./sedkp4L98': Die Operation ist nicht erlaubt.

Zuerst mal zu dem komsichen Dateinamen sedkp4L98.
Dies ist eine temporäre Datei, die vom sed angelegt wird. Das richtige "in-place" bearbeiten von Dateien geht meiner Meinung / meines Wissens nicht. Also liest er die Datei ein, bearbeitet sie im RAM und schreibt sie dann in eine solche Temp-Datei. Abschließend wird die Original-Datei gelöscht, und die temporäre Datei umbenannt.

Die Fehlermeldung sieht für mich nach folgendem Fall aus:
Du (UserID 1000) versuchst Dateien zu bearbeiten, die dem User 1001 gehören. Der sed erstellt die teporäre Datei und versucht diese per chown dem User 1001 zu geben. Das darf aber ein normaler User nicht, von daher wirft er diese Fehlermeldung.

2 Vorschläge:
- Du machst ein "sudo chown -R ." auf das Verzeichnis und legst dich als Besitzer fest
- Du führst den find-Befehl per sudo mit erhöhten Rechten aus

Persönlich würde ich eher zu zweiter Methode greifen. Wenn du allerdings verschiedene Besitzer da drin hast und dies so beabsichtigt ist, dann würde ich doch eher zu dem zweiten Befehl greifen, da hier die Besitzer nicht verändert werden.

Grüße,
BK
 
Den Befehl mit sudo auszuführen wäre natürlich eine Möglichkeit gewesen, auf die ich auch selbst hätte kommen können ;)
Funktioniert nun. Im Prinzip geht es also "nur" um die "Enteignung" bzw. "Umeignung" nach dem Umbenennen der temporären Datei, ja? Ich dachte immer, Dateien, die mir (als User) gehören und auf die ich schreibenden Zugriff habe, kann ich auch einen neuen Besitzer zuordnen. Quasi als Geschenk :D Im echten Leben funktioniert das ja (meistens) auch, hehe.

Danke nochmal für die schnelle Hilfe.

Grüße
 
Zurück