Můžete použít find
a -exec
přímo do sed
místo toho, abyste nejprve hledali oldstr
s grep
. Možná je to trochu méně efektivní, ale to nemusí být důležité. Tímto způsobem sed
nahrazení se provede u všech souborů uvedených v find
, ale pokud oldstr
není tam, evidentně to nebude fungovat.
find /path -type f -exec sed -i 's/oldstr/newstr/g' {} \;
Vaše řešení je v pořádku. zkuste to pouze tímto způsobem:
files=$(grep -rl oldstr path) && echo $files | xargs sed....
takže spusťte xargs
pouze když grep vrátí 0
, např. když našel řetězec v některých souborech.
Vzal jsem Vladův nápad a trochu ho změnil. Místo
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' /dev/null
Což dává
sed: couldn't edit /dev/null: not a regular file
Dělám ve 3 různých připojeních ke vzdálenému serveru
touch deleteme
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' ./deleteme
rm deleteme
I když je to méně elegantní a vyžaduje 2 další připojení k serveru (možná existuje způsob, jak to udělat vše na jednom řádku), funguje to také efektivně
symbolický odkaz:najít všechny soubory, které odkazují na tento soubor
dd:Jak vypočítat optimální velikost bloku?