Иногда нужно заменить строку или шаблон во всех файлах директории, но без создания временных файлов, лишнего мусора и *.bak. Обычно
sed -i решает задачу, но как это сделать рекурсивно, да еще и аккуратно?▪️ Один-liner: заменить http:// на https:// во всех .conf файлах
find . -type f -name "*.conf" -exec sed -i 's|http://|https://|g' {} +
-i делает замену на месте.
{} - текущий файл, + - запускает sed с пакетами файлов (быстрее, чем по одному).
❓ А если sed без -i (например, BSD/macOS)? Тогда делаем замену через perl:
find . -type f -name "*.conf" -exec perl -pi -e 's|http://|https://|g' {} +
Работает без временных файлов и .bak.
▪️ Хочешь dry-run? Добавь -print в find и убери -i:
find . -type f -name "*.conf" -print -exec grep -H 'http://' {} \;
▪️ Рекурсивная замена с маской и шаблоном
PATTERN="TODO"
REPLACE="Done"
find ./src -type f -name "*.txt" -exec sed -i "s/${PATTERN}/${REPLACE}/g" {} +
⭐️ Можно применять для:
📍 массовая правка конфигов;
📍 удаление старых ссылок;
📍 миграция путей или параметров;
📍 зачистка TODO/DEBUG в исходниках.
BashTex 📱 #bash #utils