// DevOps

Búsqueda y reemplazo seguros: cómo no dañar los binarios

Publicado el 22.09.2026

Al trabajar con proyectos reales (cambio de CDN, migración, refactorización) a menudo es necesario reemplazar masivamente una URL por otra.

A primera vista la tarea parece trivial: sed -i 's|old|new|g' **/* — y listo.

En la práctica ese enfoque es peligroso: el patrón también coincide en archivos binarios.

Un reemplazo descuidado provoca:

  • corrupción de archivos binarios (imágenes, PDF, archivos comprimidos);
  • cambios innecesarios en el historial de git: los binarios se marcan como modificados;
  • imposibilidad de revertir si no se hizo una copia de seguridad.

A continuación — el procedimiento para cambiar solo texto, sin tocar binarios, y creando antes una copia de seguridad puntual.

Datos iniciales

  • URL antigua: https://static-old.example-cdn.net
  • URL nueva: https://cdn-new.example-storage.net
  • Contexto: Proyecto con contenido mixto (HTML, JS, YAML + PNG, JPG, WOFF2).

Procedimiento

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 veremos qué vamos a cambiar:

bash
# 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 haya solo archivos de texto (no imágenes, fuentes, etc.). Si todo parece correcto — continuamos.

2. Copia de seguridad puntual

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.

bash
SEARCH="https://static-old.example-cdn.net"
BACKUP_DIR="backup_before_replace"

mkdir -p "$BACKUP_DIR"

# Copiamos solo los archivos con coincidencias
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 van a cambiar. Revertir — una simple copia de vuelta.

3. Reemplazo

sed -i funciona 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.

bash
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 metacaracteres en la URL (puntos, barras, guiones) — no hace falta añadir barras invertidas manualmente.

4. Control del resultado (Verificación)

Comprobamos que todo salió bien:

bash
# 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

Adicionalmente puedes ejecutar git status o git diff --stat para ver los cambios reales.

Por qué es más fiable

  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 legible y fácil de adaptar.

TL;DR — Fragmento listo para usar ahora mismo

Pega en el terminal y reemplaza tus URL:

bash
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 coincidencias
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 "¡Listo! La copia de seguridad se guardó en la carpeta $BACKUP"
echo "Revertir (si es necesario): cp -r $BACKUP/. ."

Este enfoque es seguro y funciona igual con cualquier archivo: los cambios afectan solo al texto y los datos binarios permanecen intactos.

// 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

Respondo en un día laborable (03:00-13:00 GMT)

Или оставьте заявку здесь:

Confirme que no es un bot.

Escribir y recibir una respuesta rápida