
Ich habe eine große Anzahl von Dateien, in denen ich ein vollständiges URL-Schema ersetzen muss. Einige Dateinamen enthalten Leerzeichen. Nach langem Suchen und Versuchen und Irren bin ich am nächsten gekommen:
find /somedir -type f -print0 -exec sed -i'' -e 's#http\\:\\/\\/domain.com#https\\:\\/\\/www.domain.com#g' {} +
Aus der resultierenden Datei wird das Schema http:
entfernt, übrig bleibt //
- ie '//www.domain.com'
Zusätzlich wird eine NEUE Datei erstellt, die -e
an den Dateinamen angehängt wird. – some file.php-e
was offensichtlich unerwünscht ist.
Obwohl dies sicherlich ausreichen würde (nachdem die *-e
Dateien entfernt wurden), möchte der Zwangsneurotiker in mir unbedingt wissen, wie man dies richtig macht. Hinweis: Ich arbeite lokal auf einem Mac, werde dies aber auch unter Linux durchführen.
Alle Ideen sind sehr willkommen!
Antwort1
Lösung 1: Eine Möglichkeit ist die Verwendung find
mit xargs
:
find /dir -type f -print0 | xargs -0 sed -i 's#http://domain.com#https://www.domain.com#g'
Lösung 2: Eine andere Möglichkeit wäre die Verwendung find
mit -exec
, ganz ähnlich wie in Ihrer Frage:
find /dir -type f -exec sed -i 's#http://domain.com#https://www.domain.com#g' {} +
sed
Beide Lösungen werden mit mehreren Dateien als Argumenten aufgerufen . sed
Sie werden also nicht einmal für jede Datei aufgerufen, sondern für jeden Satz von Dateien.
Lösung 3: Statt könnte man für den Suchen-Ersetzen-Job sed
auch verwenden :perl
perl -i -pe 's#http://domain.com#https://www.domain.com#g' file
Kombiniert mit dem find
/ xargs
-Befehl:
find /dir -type f -print0 | xargs -0 perl -i -pe 's#http://domain.com#https://www.domain.com#g'