📌 Рекурсивная массовая замена текста во всех файлах 🔍✏️ Иногда нужно за пару секунд заменить одну строку или слово сразу во множестве файлов в каталог…
Иногда нужно за пару секунд заменить одну строку или слово сразу во множестве файлов в каталоге и его поддиректориях.
#!/usr/bin/env bash
# автор: https://t.me/bash_srv
# Проверка аргументов
if [ "$#" -ne 3 ]; then
echo "Использование: $0 <старый_текст> <новый_текст> <путь_к_директории>"
exit 1
fi
OLD="$1"
NEW="$2"
DIR="$3"
EXT="*" # можно указать, например, "*.conf" или "*.txt"
# Находим файлы и делаем замену с созданием резервных .bak-файлов
find "$DIR" -type f -name "$EXT" -print0 \
| xargs -0 sed -i.bak "s/${OLD}/${NEW}/g"
# Удаляем .bak, если они больше не нужны
# find "$DIR" -type f -name "*.bak" -delete
echo "Заменено '$OLD' на '$NEW' во всех файлах под '$DIR'."
🔧 Как использовать
1. Сохраните скрипт, например, как /usr/local/bin/bulk-replace.sh
2. Дайте права на исполнение:
chmod +x /usr/local/bin/bulk-replace.sh
3. Запустите, указав искомую строку, замену и каталог:
/usr/local/bin/bulk-replace.sh "foo" "bar" /etc/myapp
💡 Советы и примочки
🟢 По умолчанию скрипт обрабатывает все файлы (EXT="*"). Для конкретных типов (конфиги, скрипты) замените на "*.conf" или "*.sh".
🟢 Флаг -i.bak создаёт резервную копию каждого файла с расширением .bak. Если вы уверены, что бэкапы не нужны, после замены раскомментируйте строку удаления.
🟢 При сложных шаблонах (точки, слэши) вместо прямых слэшей s/old/new/g можно использовать другой разделитель, например s|old|new|g.
🟢 Для чувствительных к регистру замен добавьте флаг I (GNU sed`): `s/${OLD}/${NEW}/gI.
🟢 Если нужно увидеть, в каких файлах были изменения, перед sed вставьте -exec grep -l "${OLD}" {} \; или используйте grep -R --include="$EXT" "${OLD}" "$DIR".
👉 @bash_srv