Búsqueda y reemplazo seguros: cómo no dañar los binarios
Publicado el 30.12.2025
Al trabajar con proyectos reales (cambio de CDN, migración, refactorización) a menudo es necesario reemplazar en masa una URL por otra.
A primera vista la tarea parece trivial: sed -i 's|old|new|g' **/* — y listo.
En realidad ese enfoque es una ruleta rusa.
Un reemplazo descuidado conduce a:
- 💀 Daño de archivos binarios (imágenes, pdf, archivos);
- 📉 Basura en el historial de git (los binarios aparecen como modificados);
- 🚫 Imposibilidad de una reversión limpia si no se hizo un respaldo.
En esta nota analizaremos un algoritmo apto para producción: cambiamos solo texto, no tocamos binarios, hacemos un respaldo puntual.
Datos iniciales
- URL antiguo:
https://static-old.example-cdn.net - URL nuevo:
https://cdn-new.example-storage.net - Contexto: Proyecto con contenido mixto (HTML, JS, YAML + PNG, JPG, WOFF2).
🛠 Algoritmo de acciones
1. Preparación y búsqueda (Dry Run)
La herramienta clave es grep -I (ignora archivos binarios, incluso si en ellos los bytes coinciden con la cadena).
Primero solo veamos qué vamos a cambiar:
# Buscamos recursivamente, ignoramos binarios, mostramos la lista de archivos
grep -rIl 'https://static-old.example-cdn.net' .
Importante: asegúrate de que en la lista solo haya archivos de texto (no imágenes, fuentes, etc.). Si todo parece correcto — seguimos.
2. Creamos un backup “inteligente”
No copiamos todo el proyecto — eso es lento y ocupa espacio. Guardamos solo los archivos que contienen la cadena buscada, preservando la jerarquía y los metadatos.
SEARCH="https://static-old.example-cdn.net"
BACKUP_DIR="backup_before_replace"
mkdir -p "$BACKUP_DIR"
# Copiamos solo los archivos que coinciden
find . -type f -print0 \
| xargs -0 grep -Il "$SEARCH" \
| xargs -I{} sh -c 'mkdir -p "$BACKUP_DIR/$(dirname "{}")" && cp -p "{}" "$BACKUP_DIR/{}"'
Ahora en backup_before_replace hay una copia exacta solo de los archivos que se modificarán. La reversión es copiar de vuelta.
3. Realizamos el reemplazo (Safe Replace)
sed -i funciona de forma diferente en Linux (GNU) y macOS (BSD):
- Linux:
sed -i 's/old/new/g' - macOS:
sed -i '' 's/old/new/g'
Para que el script funcione en todas partes (local, en CI, en Mac/Linux), usamos perl — es idéntico en todos los sistemas *nix.
OLD="https://static-old.example-cdn.net"
NEW="https://cdn-new.example-storage.net"
find . -type f -not -path "./$BACKUP_DIR/*" -print0 \
| xargs -0 grep -Il "$OLD" \
| xargs -0 perl -pi -e "s|\Q$OLD\E|$NEW|g"
\Q y \E escapan automáticamente todos los caracteres especiales en la URL (puntos, barras, guiones) — no hace falta escapar manualmente.
4. Verificación (Verification)
Comprobamos que todo se realizó con éxito:
# Debe devolver salida vacía
grep -rIl "$OLD" . --exclude-dir="$BACKUP_DIR"
# Debe mostrar los archivos modificados (ejemplo: primeros 5)
grep -rIl "$NEW" . --exclude-dir="$BACKUP_DIR" | head -n 5
Además se puede ejecutar git status o git diff --stat para ver los cambios reales.
💡 Por qué esto es correcto
grep -I— protección fiable contra la corrupción de binarios.- Copia de seguridad puntual — guardamos solo la delta, ahorrando espacio y tiempo.
perlen lugar desed— estabilidad multiplataforma (Linux, macOS, CI).- Variables y pasos claros — el script es fácil de leer y adaptar.
TL;DR — Snippet listo para «aquí y ahora»
Pégalo en la terminal y reemplaza tus URL:
SEARCH="https://static-old.example-cdn.net"
REPLACE="https://cdn-new.example-storage.net"
BACKUP="backup_$(date +%s)"
mkdir -p "$BACKUP"
# 1. Copia de seguridad puntual solo de los archivos con coincidencia
find . -type f -print0 \
| xargs -0 grep -Il "$SEARCH" \
| xargs -I{} sh -c 'mkdir -p "$BACKUP/$(dirname "{}")" && cp -p "{}" "$BACKUP/{}"'
# 2. Reemplazo seguro (perl — funciona en Linux y macOS)
find . -type f -not -path "./$BACKUP/*" -print0 \
| xargs -0 grep -Il "$SEARCH" \
| xargs -0 perl -pi -e "s|\Q$SEARCH\E|$REPLACE|g"
echo "Готово! Бэкап сохранён в папке $BACKUP"
echo "Откат (если нужно): cp -r $BACKUP/. ."
Este enfoque está comprobado en producción — seguro, fiable y universal. ¡Buena suerte con las migraciones! 🚀
Reseñas relacionadas
Hubo varios problemas, tanto en la parte técnica como en la comprensión general. Mijaíl respondió rápido a la solicitud, ayudó a aclarar las cosas y resolvió los problemas técnicos; por ello, muchas gracias. Estoy satisfecho con el resultado.
abazawolf · Configuración de VPS, configuración del servidor
18.02.2026 · ⭐ 5/5
Hubo varios problemas relacionados tanto con la parte técnica como con la comprensión en general. Mijaíl respondió rápidamente a la solicitud, ayudó a aclarar las cosas y resolvió los problemas técnicos, por lo que le doy las gracias por ello. Estoy satisfecho con el resultado.
Todo se hizo de manera rápida y precisa. Lo recomiendo.
Akelebra · Configuración de VPS, configuración del servidor
17.01.2026 · ⭐ 5/5
Todo se hizo rápido y con precisión. Lo recomiendo.
Todo salió bien, el profesional respondió rápidamente a las preguntas y ayudó a resolver el problema. ¡Gracias!
visupSTUDIO · Configuración de VPS, configuración del servidor
16.12.2025 · ⭐ 5/5
Todo fue bien, el profesional respondió rápidamente a las preguntas y ayudó a resolver el problema. ¡Gracias!
Lo hicieron todo con rapidez. Seguiremos acudiendo. ¡Lo recomiendo!
rotant · Configuración de VPS, configuración del servidor
10.12.2025 · ⭐ 5/5
Todo lo hicieron con rapidez. Seguiremos acudiendo. ¡Lo recomiendo!
Hicieron todo rápidamente. Mijaíl siempre está disponible. Seguiremos recurriendo a él.
samstiray · Configuración de VPS, configuración del servidor
10.12.2025 · ⭐ 5/5
Todo se hizo con rapidez. Михаил siempre está en contacto. Seguiremos recurriendo a él
¡Mijaíl es un profesional! Ya no es la primera vez que lo demuestra en la práctica.
Vadim_U · Configuración de VPS, configuración del servidor
Cliente acostumbrado03.12.2025 · ⭐ 5/5
Михаил, ¡un profesional! Ya lo ha demostrado en la práctica más de una vez.