Ich hatte ein ähnliches Bedürfnis und kam auf folgendes:
Dieser Befehl, um einfach alle Dateien zu finden:
grep -i -l -r foo ./*
Um this_shell.sh auszuschließen (falls Sie den Befehl in ein Skript namens this_shell.sh einfügen ), senden Sie die Ausgabe an die Konsole, um zu sehen, was passiert ist, und verwenden Sie dann sed für jeden gefundenen Dateinamen, um den Text foo durch bar zu ersetzen ::
grep -i -l -r --exclude "this_shell.sh" foo ./* | tee /dev/fd/2 | while read -r x; do sed -b -i 's/foo/bar/gi' "$x"; done
Ich habe mich für diese Methode entschieden, da mir nicht gefallen hat, dass alle Zeitstempel für nicht geänderte Dateien geändert wurden. Wenn Sie das grep-Ergebnis eingeben, können nur die Dateien mit dem Zieltext angezeigt werden (dies kann wahrscheinlich auch die Leistung / Geschwindigkeit verbessern).
Stellen Sie sicher, dass Sie Ihre Dateien sichern und testen, bevor Sie sie verwenden. Funktioniert in einigen Umgebungen möglicherweise nicht für Dateien mit eingebetteten Leerzeichen. (?)
Iist eine GNU-Erweiterung, die mit Ihrer Kopie von sed möglicherweise nicht verfügbar ist.