Puoi usare find e -exec direttamente in sed piuttosto che individuare prima oldstr con grep . Forse è un po' meno efficiente, ma potrebbe non essere importante. In questo modo, il sed la sostituzione viene eseguita su tutti i file elencati da find , ma se oldstr non è lì ovviamente non funzionerà su di esso.
find /path -type f -exec sed -i 's/oldstr/newstr/g' {} \;
La tua soluzione è ok. provalo solo in questo modo:
files=$(grep -rl oldstr path) && echo $files | xargs sed....
quindi esegui xargs solo quando grep restituisce 0 , per esempio. quando si trova la stringa in alcuni file.
Ho preso l'idea di Vlad e l'ho modificata un po'. Invece di
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' /dev/null
Che produce
sed: couldn't edit /dev/null: not a regular file
Sto facendo 3 diverse connessioni al server remoto
touch deleteme
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' ./deleteme
rm deleteme
Anche se questo è meno elegante e richiede altre 2 connessioni al server (forse c'è un modo per fare tutto in una riga) fa anche il lavoro in modo efficiente