Bandera: Русский Русский Bandera: English English

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! 🚀

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.

¿Necesitas ayuda?

Escríbeme y te ayudaré a resolver el problema

Publicaciones relacionadas