// DevOps

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

  1. grep -I — protección fiable contra la corrupción de binarios.
  2. Copia de seguridad puntual — guardamos solo la delta, ahorrando espacio y tiempo.
  3. perl en lugar de sed — estabilidad multiplataforma (Linux, macOS, CI).
  4. 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! 🚀

// Reviews

Reseñas relacionadas

Llegué con una solicitud costosa para la configuración de un servidor VPS, pero durante la consulta Mikhail propuso una solución mucho más sencilla y económica. Al final ahorré dinero y tiempo. Mikhail — un verdadero experto que trabaja por el resultado del cliente, no por la factura. ¡Lo recomiendo!

Llegué con una solicitud costosa para la configuración de un servidor VPS, pero durante la consulta Mikhail propuso una solución mucho más simple y económica. Al final ahorré presupuesto y tiempo. Mikhail es un …

kfhzasorin

Configuración de VPS, configuración del servidor

12.05.2026 · ★ 5/5

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.

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 …

abazawolf

Configuración de VPS, configuración del servidor

18.02.2026 · ★ 5/5

// Contact

¿Necesitas ayuda?

Escríbeme y te ayudaré a resolver el problema

Enviar solicitud
Escribir y recibir una respuesta rápida