Wie finde und ersetze ich jedes Vorkommen von:
subdomainA.example.com
mit
subdomainB.example.com
in jeder Textdatei unter dem /home/www/
Verzeichnisbaum rekursiv?
Wie finde und ersetze ich jedes Vorkommen von:
subdomainA.example.com
mit
subdomainB.example.com
in jeder Textdatei unter dem /home/www/
Verzeichnisbaum rekursiv?
find /home/www \( -type d -name .git -prune \) -o -type f -print0 | xargs -0 sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g'
-print0
sagt find
um jedes der Ergebnisse durch ein Nullzeichen getrennt auszugeben, anstatt eine neue Zeile zu beginnen. Für den unwahrscheinlichen Fall, dass Ihr Verzeichnis Dateien mit Zeilenumbrüchen in den Namen enthält, können Sie damit immer noch xargs
mit den richtigen Dateinamen arbeiten.
\( -type d -name .git -prune \)
ist ein Ausdruck, der alle Verzeichnisse mit dem Namen .git
. Sie können es leicht erweitern, wenn Sie SVN verwenden oder andere Ordner haben, die Sie beibehalten wollen - vergleichen Sie einfach mit mehr Namen. Es ist ungefähr gleichbedeutend mit -not -path .git
Er ist jedoch effizienter, da er nicht jede Datei im Verzeichnis überprüft, sondern sie ganz überspringt. Die -o
nachdem sie erforderlich ist, weil sie -prune
tatsächlich funktioniert.
Weitere Informationen finden Sie unter man find
.
Note : Führen Sie diesen Befehl nicht in einem Ordner aus, der ein Git-Repository enthält - Änderungen an .git könnten Ihren Git-Index beschädigen.
find /home/www/ -type f -exec \
sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +
Verglichen mit anderen Antworten hier ist diese einfacher als die meisten anderen und verwendet sed anstelle von Perl, wonach die ursprüngliche Frage fragte.
Die Tricks sind fast alle gleich, aber dieser gefällt mir:
find <mydir> -type f -exec sed -i 's/<string1>/<string2>/g' {} +
find <mydir>
: im Verzeichnis nachschlagen.
-type f
:
Datei ist vom Typ: reguläre Datei
-exec command {} +
:
Diese Variante der Aktion -exec führt den angegebenen Befehl für die ausgewählten Dateien aus, aber die Befehlszeile wird durch Anhängen von Die Gesamtzahl der Aufrufe des Befehls wird viel geringer sein als die Anzahl der ausgewählten Dateien. übereinstimmenden Dateien. Die Befehlszeile wird auf die gleiche Weise aufgebaut wie die Befehlszeilen von xargs. Nur eine Instanz von `{}' ist innerhalb des Befehls erlaubt. Das Kommando wird im Startverzeichnis ausgeführt.
Die für mich am einfachsten zu merkende Lösung ist https://stackoverflow.com/a/2113224/565525 d.h.:
sed -i '' -e 's/subdomainA/subdomainB/g' $(find /home/www/ -type f)
ANMERKUNG : -i ''
löst das OSX-Problem sed: 1: "...": invalid command code .
ANMERKUNG : Wenn es zu viele Dateien zu verarbeiten gibt, erhalten Sie Argument list too long
. Die Umgehung - Verwendung find -exec
o xargs
oben beschriebene Lösung.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
114 Stimmen
Tipp: Führen Sie die folgenden Schritte nicht in einem svn-Checkout-Baum durch... es wird die magischen .svn-Ordnerdateien überschreiben.
9 Stimmen
Oh mein Gott, das ist genau das, was ich gerade getan habe. Aber es hat funktioniert und es scheint keinen Schaden angerichtet zu haben. Was könnte schlimmstenfalls passieren?
5 Stimmen
@J.Katzwinkel: Zumindest können die Prüfsummen beschädigt werden, was wiederum Ihr Repository beschädigen kann.
4 Stimmen
Kleiner Tipp für alle, die sed verwenden: Es fügt Zeilenumbrüche an Ihre Dateien an. Wenn Sie das nicht wollen, machen Sie zuerst ein find-replace, das mit nichts übereinstimmt, und übergeben Sie das an Git. Dann führen Sie die echte Ersetzung durch. Dann rebase interaktiv und lösche das erste.
0 Stimmen
@funroll Oder verwenden Sie ein Werkzeug, das das Hinzufügen von Zeilenumbrüchen nicht erzwingt, wie z.B. Perl, oder akzeptieren Sie die Tatsache, dass POSIX strikt vorschreibt, dass Textdateien Zeilenabschlüsse haben müssen.
6 Stimmen
Sie können ein Verzeichnis, wie z. B. git, von den Ergebnissen ausschließen, indem Sie
-path ./.git -prune -o
においてfind . -path ./.git -prune -o -type f -name '*matchThisText*' -print0
vor der Übergabe an xargs0 Stimmen
Diese Antwort auf der Unix-Website StackExchange ist ebenfalls sehr interessant: unix.stackexchange.com/a/112024/354626
0 Stimmen
Alternative Lösung von SuperUser Wie kann ich eine rekursive Suche und Ersetzung über die Befehlszeile durchführen? :
find . -type f \( -iname \*.ht* -o -iname \*.php \) -exec sed -i'' -e 's/findString/replString/g' {} +
(Zeichenketten müssen escaped werden, z.B. Punkte wie\.
) Ignoriert möglicherweise Dateinamen mit Leerzeichen(?)