tgoop.com/bash_srv/92
Create:
Last Update:
Last Update:
📌 Рекурсивная массовая замена текста во всех файлах 🔍✏️
Иногда нужно за пару секунд заменить одну строку или слово сразу во множестве файлов в каталоге и его поддиректориях.
#!/usr/bin/env bash
# автор: https://www.tgoop.com/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