Te sugerimos que revises esta respuesta en un entorno controlado antes de enviarlo a producción, saludos.
Solución:
Puedes usar find
y -exec
directamente en sed
en lugar de ubicar primero oldstr
con grep
. Es quizás un poco menos eficiente, pero eso podría no ser importante. De esta manera, el sed
el reemplazo se ejecuta sobre todos los archivos enumerados por find
pero si oldstr
no está allí, obviamente no funcionará en él.
find /path -type f -exec sed -i 's/oldstr/newstr/g' ;
Tu solución está bien. solo inténtalo de esta manera:
files=$(grep -rl oldstr path) && echo $files | xargs sed....
así que ejecuta el xargs
solo cuando grep regresa 0
por ejemplo, cuando se encuentra el string en algunos archivos.
Tomé la idea de Vlad y la cambié un poco. En lugar de
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' /dev/null
Cuyos rendimientos
sed: couldn't edit /dev/null: not a regular file
Estoy haciendo en 3 conexiones diferentes al servidor remoto
touch deleteme
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' ./deleteme
rm deleteme
Aunque esto es menos elegante y requiere 2 conexiones más al servidor (tal vez haya una manera de hacerlo todo en una sola línea), también hace el trabajo de manera eficiente.
Te mostramos comentarios y valoraciones
Si posees algún preocupación o forma de regenerar nuestro crónica puedes añadir un exégesis y con mucho gusto lo ojearemos.