Vous pouvez utiliser find
et -exec
directement dans sed
plutôt que de localiser d'abord oldstr
avec grep
. C'est peut-être un peu moins efficace, mais ce n'est peut-être pas important. De cette façon, le sed
le remplacement est exécuté sur tous les fichiers listés par find
, mais si oldstr
n'est-il pas là, il ne fonctionnera évidemment pas dessus.
find /path -type f -exec sed -i 's/oldstr/newstr/g' {} \;
Votre solution est ok. essayez seulement de cette façon :
files=$(grep -rl oldstr path) && echo $files | xargs sed....
alors exécutez le xargs
uniquement lorsque grep renvoie 0
, par exemple. lorsqu'il trouve la chaîne dans certains fichiers.
J'ai repris l'idée de Vlad et je l'ai légèrement modifiée. Au lieu de
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' /dev/null
Ce qui donne
sed: couldn't edit /dev/null: not a regular file
Je fais 3 connexions différentes au serveur distant
touch deleteme
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' ./deleteme
rm deleteme
Bien que cela soit moins élégant et nécessite 2 connexions supplémentaires au serveur (il existe peut-être un moyen de tout faire en une seule ligne), il fait également le travail efficacement